我在 Debian 7(在 VPS 上)上运行 Apache 2.2,并为几个不同的网站定义了虚拟主机。
我已经为每个虚拟主机设置了单独的错误和访问日志,但我还没有找到按照我喜欢的方式轮换/存档日志的方法。
当然,Debian 上的默认 Apache 日志是通过 logrotate 轮换的,但出于各种原因,我发现这不太令人满意 - 主要是因为我希望存档日志按日期命名,并且因为为每个 vhost 单独配置它似乎很麻烦。我也不确定是否会自动删除旧日志;我可能只想在从服务器下载它们后手动执行此操作。
我理想的解决方案是每月(或者每周)执行以下操作:
- 将日期附加到文件名,或将文件移动到以日期命名的子文件夹。
- 对存档文件进行 Gzip 压缩。
我还需要这个以便于为多个虚拟主机进行设置。
理想情况下,它不应该涉及重新启动 apache(尽管正常重启并不是世界末日)。
设置它的最佳方法是什么?我确信以前有人这样做过……
答案1
(我是否察觉到一点NIH?)
这就是为什么你不应该独自做这件事的原因:
扩展比重新发明更好:本质上,你想做的事情已经包含在 logrotate 中了。如果你不喜欢它的默认行为,你可以通过以下方式配置它以不同的方式运行它是前置/后置动作、命名约定等。
解决一个已经解决的问题:为 logrotate 做出贡献的人都曾遇到过您的问题,甚至更多。在某个时候,您很可能会遇到他们遇到的相同细节问题,并且凭借更多的经验和反馈解决了这些问题……您真的想浪费精力再次解决这些问题吗?
不删除旧日志是一种非常馊主意。这会导致等待填满您的日志分区——根据您的设置,您的应用程序,甚至整个服务器,将突然停止。最好是在日常业务最繁忙的时候。
如果您出于会计原因(安全、财务、政府)需要保留旧日志,则必须为它们实施归档解决方案。
支持自制:如果您遇到问题,无需询问其他人,因为只有您使用此解决方案 - 而许多其他人都使用 logrotate。
配置是简单:只需
cp
相应sed
地配置您的 vhost。努力实现自动化。
请注意,上述原因并非一成不变,也不适用于所有地方。时不时地挑战现有的解决方案并不是一个坏主意(可能这可能是一个更好的解决方案),但在这种情况下,我认为这是徒劳的。
答案2
我在网上找到了解决这个问题的各种方法,但没有一个完全令人满意,但其中有几个是可以接受的。其中包括Apache 自己的rotatelogs
脚本,其中涉及将日志连同告诉脚本如何拆分和命名文件的参数一起传送到脚本。
但最后我还是使用了logrotate
。很惭愧,我之前阅读的在线手册已经过时了,事实上 logrotate 现在具有按日期命名文件的功能,而这正是我想要的。
我还可以使用通配符来避免将来每次添加 vhost 时都必须为 logrotate 设置新的 conf 文件。
对于其他尝试执行此操作的人,我使用的 logrotate 配置如下:
/var/www/*/logs/*.log {
weekly
missingok
rotate 52
compress
delaycompress
dateext
dateformat .%Y%m%d
extension .log
olddir old
create 640 root root
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate;
fi; \
endscript
}
我确信我将来会改变它,但作为一个起点,这很好。
(请注意,olddir
是必要的,因为否则*.log
也会匹配上周的日志文件......)
答案3
另一个选择是通过 CRON 进行。以下是我的做法;
/bin/bash #!/bin/bash 对于 /var/www/*/logs/*.log 中的文件;执行 # 压缩并截断文件(不要删除,因为 apache 除非重新启动才能写入) zip $(dirname $file)/$(date +"%Y-%m-%d")-$(basename $file).zip $file && truncate -s 0 $file 完毕
该脚本将生成一个压缩日志文件,类似于/var/www/example.com/logs/2010-01-01-access.log.zip
。