周梦康 发表于 2014-03-30 3023 次浏览 标签 : Linux

记录下工作中日志的存储管理,以 nginx 日志为例,实时写入的日志为access.log,然后把昨天的日志另存为access_20151104.log.tar.gz,设置计划任务,通过rsync备份新增的压缩的打包日志到另外一台服务器。rsync的使用笔记 http://mengkang.net/148.html 这里主要记录日志的切割。

为什么要分段切割?第一很占空间,每天的日志文件比较大,现在每天的 nginx 日志压缩完之后,还会有4~5个 G,所以需要定期删除掉一些老的日志。第二,如果日志几天不进行分段切割处理,文件太大也方便读取分析。我们公司一般就是一日一存。

之前看别人的文章中介绍通过脚本来处理:

#!/bin/bash
## 零点执行该脚本
# Nginx 日志文件所在的目录
LOGS_PATH=/usr/local/nginx/logs
# 获取昨天的 yyyy-MM-dd
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
# 移动文件
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
# 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/nginx.pid)

上面这个脚本中的最后一行必须向 Nginx 的进程发送 USR1 信号以重新打开日志文件,如果不写的话,Nginx 会继续将日志信息写入 access_[yyyy-MM-dd].log 的那个文件中,这显然是不正确的。

USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。

脚本完成后将其存入 Nginx 安装目录的 sbin 中,取名为 cut-log.sh,之后使用 crontab -e 新增一个定时任务,在其中增加执行这个脚本:

0 0 * * * /bin/bash /usr/local/nginx/sbin/cut-log.sh

上面是别人的做法,但是我在我们服务器上并没有发现类似的脚本,所以我就请教了下我们的运维大牛,原来我们使用的是logrotate这个工具。

找到一篇介绍使用的文章讲得很具体的 https://linux.cn/article-4126-1.html

我们的公司的配置文件存放的位置是自定义的,并没有像网络上的各种教程说的存放在/etc/logrotate.d/下,而是自定义了一个路径/etc/nginx.logrotate,文件内容如下:

/data/logs/*.log {
        notifempty
        daily
        rotate 5
        missingok
        dateext
        copytruncate
        compress
        create
}

首先我们了解下为什么默认情况把自定义的logrotate文件放在放在/etc/logrotate.d/目录下,并且能够自动执行。

首先我们可以看到/etc/cron.daily/logrotate这个文件

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

它会每天执行一次/etc/logrotate.conf,而/etc/logrotate.conf里就包含了/etc/logrotate.d目录,所以该目录下任务也会每天自动执行。但是不是每天0点0分执行,由于我们的日志一般都要以天为单位进行分析,所以,我们配置的是手动切割。

0 0 * * *  root /usr/sbin/logrotate -vf /etc/nginx.logrotate

还看到有人在该配置中做了重启服务的操作,难道是可重启也可不重启,明哥给我的解答是,这里的操作类似于 copy 日志,然后把原日志清了,所以不用重启。


更多配置参数说明:

参数                          功能
compress                     通过gzip 压缩转储以后的日志
nocompress                   不需要压缩时,用这个参数
copytruncate                 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate               备份日志文件但是不截断
create mode owner group      转储文件,使用指定的文件模式创建新的日志文件
nocreate                     不建立新的日志文件
delaycompress 		          和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress              覆盖 delaycompress 选项,转储同时压缩。
errors address               专储时的错误信息发送到指定的Email 地址
ifempty                      即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty                   如果是空文件的话,不转储
mail address                 把转储的日志文件发送到指定的E-mail 地址
nomail                       转储时不发送日志文件
olddir directory             转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir                     转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript          在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript         在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily                        指定转储周期为每天
weekly                       指定转储周期为每周
monthly                      指定转储周期为每月
rotate count                 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list           让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 
size size                    当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

评论列表