日志切割神器Logrotate

4,756次阅读
没有评论

共计 4575 个字符,预计需要花费 12 分钟才能阅读完成。

最近发现 VPS 上 Nginx 的日志没有切割, 运行时间长后日志也是非常大了, 占用大量的空间, 而且查询也不太方便. 经过查看发现 VPS 中是带有 logrotate 这个工具, 只是我的 Nginx 的日志不是默认地址, 所以没有切割. 那么, 我们就来修改一下 logrotate 的配置文件.

首先看下 /etc/logrotate.conf 中的全局配置.

weekly

rotate 4

create

include /etc/logrotate.d

这里四条选项可以看到是每周执行,4 个日志文件保存, 也就是 4 * 7 一个月的日志. 然后我们再去看下关于 nginx 的配置.vim /etc/logrotate.d/nginx

/var/log/nginx/*.log {
        daily                                                                       // 每天执行
        missingok                                                             // 允许丢失部分日志
        rotate 52                                                               //52 个日志文件留存
        compress                                                              // 压缩日志文件
        delaycompress                                                    // 下一次才压缩, 表示最近一次切割的日志不压缩
        notifempty                                                           // 空日志不处理
        create 0640 www-data adm                             // 创建新日志文件权限
        sharedscripts                                                      // 统一执行脚本
       prerotate                                                              // 转储前脚本
               if [-d /etc/logrotate.d/httpd-prerotate]; then \
                       run-parts /etc/logrotate.d/httpd-prerotate; \
               fi \
       endscript                                                              // 脚本结束
       postrotate                                                            // 转储后脚本
               invoke-rc.d nginx rotate >/dev/null 2>&1
       endscript                                                               // 脚本结束
}

这里我们可以看到 logrotate 默认的配置文件. 处理的目录是 /var/log/nginx/, 而我们的日志目录在 /home/wwwlog/, 那么就修改第一行为 /home/wwwlog/*.log. 修改 create 0640 www-data adm 为 create 0640 www www, 我这里的 www 是运行 nginx 的用户和组, 注意更换成自己使用的用户和组.

增加一行 su www www, 否则运行会提示以下错误, 这个 www www 是指在这个文件夹中写入权限的用户和组.

error: skipping “/home/wwwlogs/access.log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.

修改运行脚本, 否则会有如下错误提示

error: error running shared postrotate script for ‘/home/wwwlogs/*.log ‘

在 logrotate 转储过程中我们需要运行什么脚本呢? 这里要讲一下 logrotate 的运行机制. 它有两个模式, 一个是 create, 另一个是 copytruncate.create 的运行机制是改名现有的日志文件, 然后创建一个新日志文件供程序写入.copytruncate 则是将现有日志文件复制备份然后清空. 一般情况下都用 create, 因为使用 copytruncate 会出现在清空的过程中导致日志丢失. 在 create 机制下, 是改名现有日志文件, 然后创建一个新日志文件, 但是 linux 进程操作文件并不是通过文件名, 而是通过 inode, 所以程序输出的日志还是在改名的那个文件中, 那么我们需要让程序输出日志到新的文件中.

if [-f /usr/local/nginx/logs/nginx.pid]; then                   // 判断 pid 文件是否存在
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`              // 平滑重启 nginx
fi

那么, 重新修改后的文件就是以下内容了.

#/var/log/nginx/*.log {
/home/wwwlogs/*.log {
        daily
        su root root
        missingok
        rotate 4
        compress
        delaycompress
        notifempty
        create 0640 www www
        sharedscripts
#       prerotate
#               if [-d /etc/logrotate.d/httpd-prerotate]; then \
#                       run-parts /etc/logrotate.d/httpd-prerotate; \
#               fi \
#       endscript
        postrotate
                if [-f /usr/local/nginx/logs/nginx.pid]; then
                        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
                fi
        endscript
#       postrotate
#               invoke-rc.d nginx rotate >/dev/null 2>&1
#       endscript
}

 

修改完成后最好先运行 logrotate -dv /etc/logrotate.d/nginx 进行测试运行一下.

 

logrotate 命令格式:
logrotate [OPTION…] <configfile>
-d, –debug:debug 模式,测试配置文件是否有错误。
-f, –force:强制转储文件。
-m, –mail=command:压缩日志后,发送日志到指定邮箱。
-s, –state=statefile:使用指定的状态文件。
-v, –verbose:显示转储过程。

重要参数说明

———————————————————————————————————
compress 通过 gzip 压缩转储以后的日志
nocompress 不做 gzip 压缩处理
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate 备份日志文件不过不截断
create mode owner group 轮转时指定创建新文件的属性,如 create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
missingok 如果日志丢失,不报错继续滚动下一个日志
errors address 专储时的错误信息发送到指定的 Email 地址
ifempty 即使日志文件为空文件也做轮转,这个是 logrotate 的缺省选项。
notifempty 当日志文件为空时,不进行轮转
mail address 把转储的日志文件发送到指定的 E -mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts 运行 postrotate 脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate 在 logrotate 转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate 在 logrotate 转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份
dateext 使用当期日期作为命名格式
dateformat .%s 配合 dateext 使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合 dateext 使用,只支持 %Y %m %d %s 这四个参数
size(或 minsize) log-size 当日志文件到达指定的大小时才转储,log-size 能指定 bytes(缺省) 及 KB (sizek)或 MB(sizem).
当日志文件 >= log-size 的时候就转储。以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5(>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M

正文完
 
Winter
版权声明:本站原创文章,由 Winter 2018-01-12发表,共计4575字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码