如何在一周后删除日志文件?

问题描述 投票:1回答:1

我已安排批处理作业每4小时运行一次,以从数据库中获取最新记录。

此外,我正在维护日志文件,每当批处理作业运行时,该文件将被更新。为了补偿存储内存,我需要每周删除日志文件。

我试图用Batch file to delete files older than N days来解决这个任务。

在我的情况下,文件日志文件将每4小时更新一次。

windows batch-file windows-xp
1个回答
1
投票

不建议删除定期附加行的整个日志文件,因为这会导致在特定时间丢失过去N天的所有信息。例如,每周日删除日志文件,并在星期一早上检测到上次备份发生了不好的事情,并且您想知道发生了什么,您确实存在问题,因为信息不再可用。

通常,保留日志和备份文件的时间跨度并不重要,因为存储介质大小限制了日志文件的大小,或者在存储介质已满之前可以存储多少个文件大小为X的备份。

因此,在我看来,在特定时间段内关注日志和备份文件的存储大小使用情况是一个更好的策略。与大型备份相比,可能存在大多数备份文件,其中只有一些MiB存储多个GiB。因此,对于小型备份,备份数量(=备份时间段)可能大于小型备份。对于日志文件,在日志文件大小变得严重之前,每次执行时附加的数据量是多少,而不是在将数据附加到日志文件的时间段内的备份执行次数。

所以关注日志文件大小而不是时间段我建议如下:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Define file size limit for the log file with 4 MiB.
set "SizeLimit=4194304"
set "LogFile=C:\BackupFolder\Backup.log"

for %%I in ("%LogFile%") do if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI"

endlocal

在每次执行此小批处理文件时,将指定日志文件的文件大小与批处理文件中定义的文件大小限制进行比较。

如果日志文件的文件大小大于或等于定义的文件大小限制,则在文件扩展名覆盖可能已存在的具有相同名称和文件扩展名的_old文件之前,将当前日志文件移动到同一目录中并插入_old

换句话说,只要日志文件具有4个或更多MiB,此批处理文件就会将C:\BackupFolder\Backup.log移动到C:\BackupFolder\Backup_old.log,并自动覆盖最可能已存在的C:\BackupFolder\Backup_old.log

结果是至少总是有一个日志文件,Backup.logBackup_old.log,带有最后N次备份操作的记录消息。

并且在两个日志文件的存储介质上所需的总大小在最坏的情况下大约是8 MiB加上来自上次备份操作的一些KiB。

可以根据每个备份操作默认附加的数据量来定义文件大小限制。例如,如果每4小时执行一次典型的备份操作,将数据上的96 KiB附加到日志文件,则文件大小限制的公式为:

96 KiB x 6 backups per day x 7 days = 4032 KiB

4032 KiB略小于4096 KiB(= 4 MiB)。因此,对于下一次备份,将达到4 MiB文件大小限制,并移动当前日志文件以替换旧日志文件。换句话说,在典型备份中,每个日志文件都包含创建新文件之前大约一周的日志消息。

这个简单的批处理文件也可以定义为从其他批处理文件中调用各种文件大小限制的日志文件,这样就可以在服务器上为许多不同的日志文件使用1个批处理文件。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" goto EndFileSizeCheck
set "LogFile=%~1"

rem Define default file size limit for the log file with 4 MiB.
set "SizeLimit=4194304"
if not "%~2" == "" set "SizeLimit=%~2"

for %%I in ("%LogFile%") do if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI"

:EndFileSizeCheck
endlocal

上面的批处理文件需要第一个参数作为日志文件的名称。作为第二个参数,可以选择指定文件大小限制。如果没有传递给批处理文件的文件大小限制,则默认使用4 MiB。

重要信息:文件大小比较仅适用于最多2个GiB - 1 = 2 ^ 31 - 1个字节= 2147483647个字节。因此,请使用文件大小限制,以保证日志文件的当前大小或多或少保证不超过2 GiB或更多。

上述批处理代码也可用于目录中的所有* .log文件。但在这种情况下,将日志文件移动到另一个目录,或者在移动时更改文件扩展名,或者添加额外的代码以确保旧的日志文件不会一次又一次地移动是很重要的。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
if "%~1" == "" goto EndFileSizeCheck
set "LogFile=%~1"

rem Define default file size limit for the log file with 4 MiB.
set "SizeLimit=4194304"
if not "%~2" == "" set "SizeLimit=%~2"

for %%I in ("%LogFile%") do (
    set "FileName=%%~nI"
    if /I not "!FileName:~-4!" == "_old" if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI"
)

:EndFileSizeCheck
endlocal

上面的批处理文件变体可以从另一个批处理文件中调用,例如with

call FileSizeCheck.bat "C:\BackupFolder\*.log" 16777216

检查文件大小限制为16 MiB的文件夹C:\BackupFolder中的每个* .log文件,忽略该目录中已存在的* _old.log文件。

注意:日志文件名或其路径不能包含感叹号,因为在使用此批处理代码时使用延迟的环境变量扩展,否则代码不能按设计工作。

要了解使用的命令及其工作方式,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /? ...解释%~1%~2
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • move /?
  • rem /?
  • set /?
  • setlocal /?

前两个批处理文件中不需要命令setlocal EnableExtensions DisableDelayedExpansionendlocal,因为默认情况下启用了命令扩展,默认情况下在Windows上禁用延迟扩展。但是该用法确保批处理文件的环境变量永远不会被批处理文件检查文件大小并在达到文件大小限制时移动文件。

© www.soinside.com 2019 - 2024. All rights reserved.