Apache 2 具有 rotatelogs,它似乎可以做它所说的事情,即允许我为虚拟主机定义一个位置和一个管道,并且在这种情况下,error_log 按大小或时间轮换。
我在 OS X 上,logrotate 不可用,看起来好像使用了 syslog,但在这种情况下 Apache 不会将日志记录到 syslog,我也不认为这是我想要做的。如果我让 syslog 接管,它将轮换、压缩、发送电子邮件等等,但随后我必须 hup Apache,我认为这有点暴力。
我今天只处理 error_log,想要一个大小为 200K 的日志文件,然后进行轮换。rotatelogs 以 1M 作为值,我可以使用像 .2M 这样的值吗?
我认为 syslog 不起作用的另一个原因是,每次添加新的虚拟主机时,我都必须在 syslog 配置设置中定义一行。
Apache 的 rotatelogs 存在两个问题:
1)日志有根所有者,有什么方法可以定义所有者是什么,或者任何与此相关的权限?
2)有数百个虚拟主机,我想保留 10 个左右的日志,然后删除其余的。这通常是用 unix find 和 gzip 和 rm 等解决的吗?
摘要:我有 /path/www/lastname.firstname/logs/,其中 lastname.firstname 将是数百个目录。error_log 需要转到该 lastname.firstname 的日志目录。我正在寻找如何确保这些日志文件不会变得太大和失控。我实际上希望它们非常小,以便用户可以快速下载它们并在开发过程中查看错误。用户将没有 shell 访问权限,因此他们无法在日志上使用类似 tail -f 的操作。
答案1
为什么不直接在 OS X 服务器上安装 logrotate?它是 Unix,logrotate 可在 Unices 上运行……这两者实际上是天生一对。
答案2
我非常同意使用 logrotate 程序来处理这种情况。logrotate 包通常有一个 apache 日志轮换器示例。但是,您会发现它通常会执行以下操作:(1) 重命名日志文件,然后 (2) 发出非致命的 kill 命令,以便 apache 关闭当前日志文件并创建新的日志文件。在 kill 命令(试图对您的用户友好)之后的一小段时间内,日志数据可能会被放置在旧日志文件中。
使用管道日志旋转功能的其他几个实用要点:
每个日志文件都会消耗额外的进程。如果您已经有很多进程,这可能会有问题。
当然,使用更多的总打开文件句柄当然是可以配置的。
我曾经有过这样的经历:在 Apache 服务器关闭期间,并非所有东西都会正常终止。不过,这已经是很久以前的事了。但它也使得简单地使用 -9 终止 Apache 进程有时会出现问题,从而留下僵尸进程。
顺便说一句,我亲自将 logrotate 包轻松地移植到不同的 UNIXen/Linuxen 系统。
享受!