我们的 PHP 日志文件越来越大,我们需要一个实用程序来定期轮换文件。这是在 Windows 2003 Server 上。
有没有类似于 Linux 的程序/脚本logrotate
?
是的,我们正在忙于彻底检查 PHP 脚本以消除所有错误、通知和警告。
答案1
如果你使用 Apache 运行 PHP,那么有一个名为旋转日志你可以将日志通过管道传输,它会自动为你进行日志轮换。以下是在 Windows 上使用它的方法:
ErrorLog "|bin/rotatelogs.exe -l logs/error/error.%Y-%m-%d.log 86400"
另一种方法是在运行时将 PHP 错误日志位置设置为包含日期的文件,即将其添加到前置文件中:
ini_set('error_log', 'path_to_logs/php_error.'.date('Y-m-d').'.log');
答案2
我知道你的痛苦。几年前,我读了 logrotate 的源代码,并将其移植到 Windows(在此过程中从 C 转换为 Perl - 是的,我是个自讨苦吃的人)。
Windows 日志轮换的主要问题是文件锁定。如果文件在轮换期间处于打开状态,则无法移动、重命名等。我解决了这个问题,因为我决定对于我的应用程序来说,轮换比丢失几行日志更重要,因此只需进行复制,然后截断(尽管我确信还有更多问题,不幸的是我没有现成的源代码)。无论如何,事实证明操作非常快,我非常怀疑我们在使用历史中丢失的不仅仅是几行。
我认为这就是为什么本机 Windows 应用程序通常进行自己的日志轮换的原因——应用程序本身持有锁并可以在轮换发生时缓存日志消息以供稍后刷新。
答案3
根据我的经验,最好的方法是禁用内部 PHP 日志并将其记录到 Windows 错误日志(或 unix 主机上的 syslog)。
一旦 ntsyslog 或类似程序可以将日志发送到 *nix 主机,其中像 logwatch 这样的工具可以轻松进行过滤。
答案4
我用 ”类比“实用程序来轮换我的 Perforce 日志,我使用以下命令:
C:\Support\Scripts\rnanalog.exe C:\Data\p4journal\audit.log C:\Data\p4backups\audit.logs\audit_mmmddccyy.log
在批处理文件中,并通过计划任务在午夜运行它。
如果文件锁定是一个问题,那么您可能需要在日志轮换时停止服务几秒钟......