The script below began based on a script found in the OpenSSH GitHub forum. We had an OpenSSH log file that was about 550 MB in size. This made it hard to open in NotePad++ and difficult to find anything on a given date.
Then we realized we have a similar issue (but not nearly as bad) with BizTalk FTP/SFTP log files. In a SendPort you can turn on logging. Fortunately all the files were written to a “logs” folder. The second part of the script does the same logic for all *.log or *.txt files in the “logs” folder.
#--------------------------------------------------------------
#
# Neal Walters - 04/02/2020 - modified from suggested script from
# https://github.com/PowerShell/Win32-OpenSSH/issues/935
# to keep the size of the log file down -
#
# Schedule this in task scheduler.
# Problem is that the log file get's huge after a few weeks,
# and it can be hard to find and isolate issues.
#
# Script basically dates each log file, and a new one will
# be created for each day (the new/current one doesn't have a
# date)
#
#--------------------------------------------------------------
cls
$ErrorActionPreference = "Stop" #keep script from continuing if any error
#--------------------------------------------------------------
$OpenSSHLogFile = "c:\ProgramData\ssh\logs\sshd.log"
#Original sample checked for size of file, but we want a new file every day.
#if ((Get-ChildItem $OpenSSHLogFile).Length -gt 100000)
$fileDateFormat = get-date -f _yyyy_MM_dd
$newFileName = $OpenSSHLogFile.Replace("sshd","sshd_$fileDateFormat");
Write-Host "NewFile: $newFileName"
if (-not (Test-Path $newFileName))
{
copy-item $OpenSSHLogFile $newFileName
$null | Set-Content $OpenSSHLogFile
}
#--------------------------------------------------------------
# Part 2 - do similar for all BizTalk FTP/SFTP Log Files
# BizTalk Send/Receive for FTP/SFTP have the option to log,
# and we place them in the disk structure below.
#--------------------------------------------------------------
$logFolder = "e:\Integration\Logs"
$logFiles = Get-ChildItem $logFolder -Recurse -File
foreach ($logFile in $logFiles)
{
#when we rename file and put date on it, we put a double underscore in it
#so that on the next pass, we ignore all files iwth double underscores
if (-not $logfile.FullName.Contains("__"))
{
$fileDateFormat = get-date -f _yyyy_MM_dd
# file may have suffix of .txt or .log
$newFileName = $logFile.FullName
$newFileName = $newFileName.Replace(".log","__$fileDateFormat.log");
$newFileName = $newFileName.Replace(".txt","__$fileDateFormat.txt");
# If someone runs scripts twice on same day, we don't want
# file with zero size to wipe out the file from the previous run, so don't copy it in that case.
if (-not (Test-Path $newFileName))
{
copy-item $logFile.FullName $newFileName
$null | Set-Content $logFile.FullName
}
}
}
#--------------------------------------------------------------
# Part 3 : delete log files here if file is over x days old
#--------------------------------------------------------------
$keepDays = 60
$files = GET-CHILDITEM $logFolder -RECURSE -FILE | Where LastWriteTime -lt (Get-Date).AddDays(-$keepDays)
foreach ($file in $files)
{
#Write-Host $file.LastWriteTime
if ($file.LastWriteTime.AddDays($keepDays) -lt (GET-Date))
{
#Write-Host "$file.FileName will be deleted"
$deleteCount = $deleteCount + 1
Remove-Item $file.FullName
}
}
Write-Host "End"
Results
The first day you run it, the old large file will be renamed. Then each subsequent day will only have the activity for that single day.