我已安排批处理作业每4小时运行一次,以从数据库中获取最新记录。
此外,我正在维护日志文件,每当批处理作业运行时,该文件都会更新。为了补偿存储内存,我需要每周删除日志文件。
我曾试图用Batch file to delete files older than N days解决任务。
在我的情况下,文件日志文件将每4小时更新一次。
答案 0 :(得分:1)
不建议删除定期附加行的整个日志文件,因为这会导致在特定时间丢失过去N天的所有信息。例如,每个星期天删除日志文件,并在星期一早上检测到上次备份发生了不好的事情,并且你想知道发生了什么,你真的有问题,因为信息不再可用。
通常,保留日志和备份文件的时间跨度并不重要,因为存储介质大小限制了日志文件的大小,或者在存储介质已满之前可以存储多少个文件大小为X的备份。 / p>
因此,在我看来,在特定时间段内关注日志和备份文件的存储大小使用情况是一个更好的策略。与大型备份相比,可能存在大多数备份文件,其中只有一些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
em>具有相同名称和文件扩展名的文件。
换句话说,每当日志文件包含4个或更多MiB时,此批处理文件会将 C:\BackupFolder\Backup.log
移动到C:\BackupFolder\Backup_old.log
并自动覆盖最有可能已存在的C:\BackupFolder\Backup_old.log
结果是至少总有1个日志文件,Backup.log
或Backup_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
上面的批处理文件变体可以从另一个批处理文件中调用,例如使用
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 DisableDelayedExpansion
和endlocal
,因为默认情况下启用了命令扩展,默认情况下在Windows上禁用延迟扩展。但是该用法确保批处理文件的环境变量永远不会被批处理文件检查文件大小并在达到文件大小限制时移动文件。