如何在Windows Server 2003上旋转PHP日志文件?

我们的PHP日志文件越来越大,我们需要一个实用程序来定期旋转文件。 这是在Windows 2003 Server上。

有没有类似Linux的logrotate程序/脚本?

是的,我们正忙于检修PHP脚本,以消除所有的错误,通知和警告。

如果您使用的是Apache来运行PHP,那么有一个名为rotatelogs的内置工具,您可以通过pipe道传输日志,它会自动为您执行日志轮换。 这里是你如何在Windows上使用它:

 ErrorLog "|bin/rotatelogs.exe -l logs/error/error.%Y-%m-%d.log 86400" 

另一种方法是将运行时的PHP错误日志位置设置为包含date的文件,即将其添加到您的前置文件中:

 ini_set('error_log', 'path_to_logs/php_error.'.date('Ym-d').'.log'); 

我知道你的痛苦 几年前,我终于阅读了logrotate的源代码,并将其移植到Windows(在这个过程中从C转换到Perl–是的,我是一个惩罚的饕客)。

Windows日志旋转的主要问题是文件locking。 如果一个文件在旋转过程中是打开的,它不能被移动,重命名等等。我通过决定对于我的应用程序来说,旋转比一些错过的对数更重要,然后简单地做一个副本,然后截断(虽然,我敢肯定,还有比这更多的,不幸的是我没有来源可用)。 无论如何,事实certificate,这个行动太快了,我非常怀疑我们在使用历史上已经损失了几条线。

我相信,这就是为什么本地Windows应用程序通常会执行自己的日志轮换 – 应用程序本身持有锁,并可以在轮换发生时caching日志消息,以便稍后刷新。

根据我的经验,最好的方法是使内部PHP日志无效并将其logging到Windows错误日志(或unix主机上的syslog)中。

一旦有ntsyslog或类似的可以打日志到一个* nix主机,像logwatch这样的工具使过滤容易。

我不使用PHP,但是对于SQUID,我有一个在午夜运行的batch file,并停止SQUID,重命名日志文件并重新启动SQUID。 要生成文件名称,请使用以下内容:

 for /f "tokens=1" %%i in ('date /t') do set THEDATE=%%i set THEDAY=%THEDATE:~0,2% set FILENAME=Squid-%THEDAY%.log 

这是英国的date格式,当天是前两个字符。 你可以通过改变第二行来selectdate的任何位。

JR

我使用“ rnanalog ”实用程序来旋转我的Perforce日志,我使用下面的命令:

 C:\Support\Scripts\rnanalog.exe C:\Data\p4journal\audit.log C:\Data\p4backups\audit.logs\audit_mmmddccyy.log 

在batch file中,只需通过计划任务在午夜运行。

如果文件locking是一个问题,那么您可能必须停止服务几秒钟,而日志旋转…