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

Posted

技术标签:

【中文标题】一周后如何删除日志文件?【英文标题】:How to delete log file after a week? 【发布时间】:2016-12-24 02:58:53 【问题描述】:

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

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

我曾尝试使用Batch file to delete files older than N days 解决任务。

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

【问题讨论】:

所以您想删除日志文件中超过 7 天的条目? 我需要删除日志文件。或者清空日志详细信息 根据修改日期删除日志文件,使用forfiles;要根据创建日期删除它们,forfiles 不能使用,并且由于批处理脚本无法进行真正的日期/时间数学,我推荐另一种语言(例如 PowerShell)。从日志文件中删除 contents 是完全不同的事情,您需要能够通过某种时间戳来识别条目的年龄;你需要给我们看一些样品。无论如何,也许您可​​能对此感兴趣:Equivalent of LogRotate for Windows? 【参考方案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具有相同名称和文件扩展名的文件。

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

结果是至少总是有 1 个日志文件,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,并且当前日志文件被移动以替换旧日志文件。换句话说,在典型的备份中,每个日志文件都包含在创建新文件之前大约一周的日志消息。

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

@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 文件。

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

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

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

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

【讨论】:

以上是关于一周后如何删除日志文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pentaho 删除文件

关闭日志文件

配置Apache Archiva日志文件

SQL2005自动备份,定期删除的维护计划及自动定期清除日志

如何在持续时间后删除 blob?

如何删除SQL SERVER中的日志文件