我知道你的痛苦。几年前,我最终阅读了 logrotate 的源代码,并将其移植到了 Windows(在此过程中从 C 转换为 Perl——是的,我是一个贪吃的惩罚者)。
Windows 日志轮换的主要问题是文件锁定。如果文件在轮换期间打开,则无法移动,重命名等。我解决了这个问题,通过决定对于我的应用程序,轮换比丢失的一些日志行更重要,然后简单地复制,然后truncate (不过,我确信它还有更多内容,不幸的是我没有现成的源代码)。无论如何,事实证明这个操作是如此之快,以至于我非常怀疑我们在它的使用历史上已经丢失了不止几行。
我相信,这就是为什么原生 Windows 应用程序通常会进行自己的日志轮换的原因——应用程序本身持有锁,并且可以在轮换发生时缓存日志消息,以供以后刷新。
如果您使用 Apache 运行 PHP,那么有一个名为rotatelogs的内置实用程序,您可以通过管道传输您的日志,它会自动为您执行日志轮换。这是在 Windows 上使用它的方法:
另一种选择是将运行时的 PHP 错误日志位置设置为包含日期的文件,即将其添加到您的前置文件中:
我知道你的痛苦。几年前,我最终阅读了 logrotate 的源代码,并将其移植到了 Windows(在此过程中从 C 转换为 Perl——是的,我是一个贪吃的惩罚者)。
Windows 日志轮换的主要问题是文件锁定。如果文件在轮换期间打开,则无法移动,重命名等。我解决了这个问题,通过决定对于我的应用程序,轮换比丢失的一些日志行更重要,然后简单地复制,然后truncate (不过,我确信它还有更多内容,不幸的是我没有现成的源代码)。无论如何,事实证明这个操作是如此之快,以至于我非常怀疑我们在它的使用历史上已经丢失了不止几行。
我相信,这就是为什么原生 Windows 应用程序通常会进行自己的日志轮换的原因——应用程序本身持有锁,并且可以在轮换发生时缓存日志消息,以供以后刷新。
根据我的经验,最好的方法是禁用内部 PHP 日志并将其记录到 Windows 错误日志(或 unix 主机上的 syslog)。
一旦有 ntsyslog 或类似的可以将日志推送到 *nix 主机,其中 logwatch 等工具使过滤变得容易。
我不使用 PHP,但使用 SQUID,我有一个在午夜运行并停止 SQUID、重命名日志文件并重新启动 SQUID 的批处理文件。要生成文件名,请使用以下内容:
这是英国日期格式,其中日期是前两个字符。只需更改第二行,您就可以挑选出日期的任何部分。
JR
我使用“ rnanalog ”实用程序来轮换我的 Perforce 日志,我使用以下命令:
在批处理文件中,只需在午夜通过计划任务运行它。
如果文件锁定是一个问题,那么您可能需要在日志轮换时停止服务几秒钟......