add_filter('xmlrpc_enabled', '__return_false'); 日志切割神器Logrotate | 癹冬阁
  • 欢迎访问癹冬阁,本站专注于IT服务,记录工作点滴

日志切割神器Logrotate

开源世界 Winter 5个月前 (01-12) 510次浏览 已收录 0个评论

最近发现 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


癹冬阁版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明日志切割神器 Logrotate
喜欢 (0)
[winters@8win.net]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址