在Linux VPS上配置日志自动按日分割压缩处理

从风云主机跑路之后,就一直在折腾VPS,虽然我没有什么重要的站,只有一个很久没更新也没什么流量的小博客,但是这个小博客不管怎么说也是从2005年(实际是2004年)就一直坚持下来的“成果”,记录了我在编程、前端上学习和成长的点滴,无论如何我还是要让它坚持在这个网络里存在下去的。

风云主机跑路之后,我痛定思痛,虽然还是选择的国人VPS,但一口气买了几家的,然后多台VPS之间,文件实时同步,MySQL主主同步(这个貌似有网友感兴趣,QQ上反复咨询,回头我再写一篇),这样即使某一家跑路了,我也不用手忙脚乱了,而且还保证了一台VPS宕机时博客的访问不受影响(感谢DNSPod的A记录负载均衡)。

以前很不重视webserver的日志分析,这次配置lnmp环境后,nginx和apache的日志都启用了,为了避免日志文件过大,又利用cron和logrotate实现了日志的每日截断备份和自动清理。网上教程很多,但是参考中还是走了少量弯路(MySQL主主同步也如此),所以还是把自己的步骤记录一下,以备日后参照:

一、指定log路径

我希望nginx、apache、php的日志都一起处理,不想分开单独搞,所以就把所有的log都统一存放到同一个地方,统一用.log后缀。

首先是nginx,在nginx.conf中指定全局的error_log路径:

error_log  /home/wwwlogs/nginx_error.log  crit;

然后在每个虚拟主机的配置文件中指定access_log路径,一样的:

access_log  /home/wwwlogs/ofcss-access.log  ofcss-www;

然后是apache,也是分别指定,在httpd.conf中指定全局的log路径:

ErrorLog "/home/wwwlogs/httpd-error.log"
CustomLog "/home/wwwlogs/httpd-access.log" combinedio

然后在每个虚拟主机的配置文件中单独指定

ErrorLog "/home/wwwlogs/ofcss-error.log"
CustomLog "/home/wwwlogs/ofcss-access.log" combined

最后是php的错误日志,在php.ini中指定

error_log = /home/wwwlogs/php_errors.log

基本上,要点有两条:

  • 所有的log文件都指定到同一个位置存放(我这里就是/home/wwwlogs/
  • 所有的log文件都统一后缀(我这里就是.log

二、配置logrotate

logrotate是linux系统自带的日志转储工具,有默认而好用的工具,我一般就不会考虑单独装个软件来实现了,毕竟VPS的资源能省则省嘛。

logrotate的配置文件一般是在/etc/logrotate.conf文件里,但是它默认包含了/etc/logrotate.d/目录下的其它配置文件,所以我把我的配置文件放在/etc/logrotate.d/weblog里:

/home/wwwlogs/*.log
    {
        nocompress
        daily
        copytruncate
        create
        ifempty
        olddir /home/wwwlogs/days
        rotate 5
    }

按照之前指定的路径,这个配置就指定了对/home/wwwlogs/目录下的所有**.log*都做相同处理。

三、编写定时脚本

logrotate的配置文件只是指定了每日执行转储、不压缩、转储路径等选项,但是要按日期命名、压缩、删除旧文件等,还需要写个定时脚本来实现。代码如下(假定文件为/usr/local/sbin/logrotate-weblog.sh):

#!/bin/bash
    #创建转储日志压缩存放目录
    mkdir -p /home/wwwlogs/days
    #手工对nginx日志进行切割转换
    /usr/sbin/logrotate -vf /etc/logrotate.d/weblog
    #当前时间
    time=$(date -d "yesterday" +"%Y-%m-%d")
    #进入转储日志存放目录
    cd /home/wwwlogs/days
    #对目录中的转储日志文件的文件名进行统一转换
    for i in $(ls ./ | grep "^\(.*\)\.[[:digit:]]$")
    do
    mv ${i} ./$(echo ${i}|sed -n 's/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo $time)
    done
    #对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
    for i in $(ls ./ | grep "^\(.*\)\-\([[:digit:]-]\+\)$")
    do
    tar jcvf ${i}.bz2 ./${i}
    rm -rf ./${i}
    done
    #只保留最近7天的压缩转储日志文件
    find /home/wwwlogs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} \;

四、制定cron计划定时执行这个脚本

这个很简单了,crontab -e然后输入并保存即可:

#logrotate-weblog
    0 2 \* * *| /usr/local/sbin/logrotate-weblog.sh > /dev/null 2>&1

要定时执行任务,必须确保crond服务是自动运行的:

chkconfig crond on

以上只是基于我自己的VPS所做的配置,中间的代码注释未必细致和准确,如果需要进一步了解的话,可以自行google,教程很多。其它发行版的操作也差不多。

本条目发布于。属于所谓技术分类,被贴了 标签。
               

在Linux VPS上配置日志自动按日分割压缩处理》上有8条评论

  1. http://www.schydl.com

    写的很好,多谢分享,欢迎回访

  2. http://www.schydl.com

    写的很好,多谢分享,欢迎回访

  3. 逛窑子

    独立博客很不容易啊,坚持下去,加油。
    有空来我的小站回访一下哈。

  4. canghai

    在代码注释里面给自己的博客打广告的家伙。。。。。。

  5. nornor

    技术控啊~我现在的VPS跑了很多月了,暂时还是妥妥的。已经170天没有重启过了。有空交流交流哈~

评论已关闭。