一周后如何删除日志文件?
How to delete log file after a week?
我已经安排了一个批处理作业 运行 每 4 小时从数据库中获取最新记录。
我还在维护日志文件,只要批处理作业 运行s 就会更新。为了补偿存储内存,我需要每周删除日志文件。
我曾尝试用 Batch file to delete files older than N days 解决任务。
在我的例子中,文件日志文件将每 4 小时更新一次。
不建议删除定期附加行的整个日志文件,因为这会导致在特定时间丢失最后 N 天的所有信息。例如每个星期天删除日志文件,并在星期一早上检测到上次备份发生了错误,你想知道发生了什么,你真的有问题,因为信息已经不可用了。
一般来说,保存日志和备份文件的时间跨度并不重要,因为存储介质的大小限制了日志文件的大小或者在存储介质满之前可以存储多少个文件大小为 X 的备份.
因此,在我看来,关注日志和备份文件的存储大小使用情况然后关注特定时间段是一个更好的策略。与具有几个 GiB 的大型备份相比,仅存储一些 MiB 的备份文件通常更多。因此,对于小型备份,备份数量(=备份时间段)可以大于小型备份。对于日志文件,在日志文件大小变得关键之前,每次执行附加了多少数据比将数据附加到日志文件的时间段内的备份执行次数更重要。
所以我建议关注日志文件大小而不是时间段:
@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 具有相同名称和文件扩展名的文件。
换句话说,这个批处理文件 将 C:\BackupFolder\Backup.log
移动到 C:\BackupFolder\Backup_old.log
并自动覆盖一个很可能已经存在的 C:\BackupFolder\Backup_old.log
每当日志文件有 4 个或更多 MiB。
结果是至少总是有 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
检查文件夹 C:\BackupFolder
中的每个 *.log 文件是否超过 16 MiB 的文件大小限制,并忽略该目录中已经存在的 *_old.log 文件。
注意:日志文件名或其路径不能包含感叹号,因为按原样使用此批处理代码时使用延迟环境变量扩展,否则代码将无法运行按照设计。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 解释 %~1
和 %~2
echo /?
endlocal /?
for /?
if /?
move /?
rem /?
set /?
setlocal /?
前两个批处理文件中不需要命令 setlocal EnableExtensions DisableDelayedExpansion
和 endlocal
,因为命令扩展在默认情况下处于启用状态,延迟扩展在 Windows 上默认处于禁用状态。但是这种用法确保调用批处理文件的环境变量永远不会被批处理文件检查文件大小并在达到文件大小限制时移动文件而修改。
我已经安排了一个批处理作业 运行 每 4 小时从数据库中获取最新记录。
我还在维护日志文件,只要批处理作业 运行s 就会更新。为了补偿存储内存,我需要每周删除日志文件。
我曾尝试用 Batch file to delete files older than N days 解决任务。
在我的例子中,文件日志文件将每 4 小时更新一次。
不建议删除定期附加行的整个日志文件,因为这会导致在特定时间丢失最后 N 天的所有信息。例如每个星期天删除日志文件,并在星期一早上检测到上次备份发生了错误,你想知道发生了什么,你真的有问题,因为信息已经不可用了。
一般来说,保存日志和备份文件的时间跨度并不重要,因为存储介质的大小限制了日志文件的大小或者在存储介质满之前可以存储多少个文件大小为 X 的备份.
因此,在我看来,关注日志和备份文件的存储大小使用情况然后关注特定时间段是一个更好的策略。与具有几个 GiB 的大型备份相比,仅存储一些 MiB 的备份文件通常更多。因此,对于小型备份,备份数量(=备份时间段)可以大于小型备份。对于日志文件,在日志文件大小变得关键之前,每次执行附加了多少数据比将数据附加到日志文件的时间段内的备份执行次数更重要。
所以我建议关注日志文件大小而不是时间段:
@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 具有相同名称和文件扩展名的文件。
换句话说,这个批处理文件 将 C:\BackupFolder\Backup.log
移动到 C:\BackupFolder\Backup_old.log
并自动覆盖一个很可能已经存在的 C:\BackupFolder\Backup_old.log
每当日志文件有 4 个或更多 MiB。
结果是至少总是有 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
检查文件夹 C:\BackupFolder
中的每个 *.log 文件是否超过 16 MiB 的文件大小限制,并忽略该目录中已经存在的 *_old.log 文件。
注意:日志文件名或其路径不能包含感叹号,因为按原样使用此批处理代码时使用延迟环境变量扩展,否则代码将无法运行按照设计。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 解释%~1
和%~2
echo /?
endlocal /?
for /?
if /?
move /?
rem /?
set /?
setlocal /?
前两个批处理文件中不需要命令 setlocal EnableExtensions DisableDelayedExpansion
和 endlocal
,因为命令扩展在默认情况下处于启用状态,延迟扩展在 Windows 上默认处于禁用状态。但是这种用法确保调用批处理文件的环境变量永远不会被批处理文件检查文件大小并在达到文件大小限制时移动文件而修改。