【Linux】linux系统自带的日志切割工具logrotate详解

概要

在日常运维中,日志切割是一个比较基础且重要的操作,可以自己编写shell实现,也可以借助于系统自带的软件来实现,今天我们使用linux自带的logrotate来实现对nginx日志的切割。

技术细节

Linux系统默认安装logrotate工具,它默认的配置文件在:

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行,类似于nginx的vhost。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

查看版本

logrotate --version

在这里插入图片描述

# 查看默认配置文件
cat /etc/logrotate.conf
[root@ziyi ~]# cat /etc/logrotate.conf
weekly       #  默认每周执行一次日志轮询
rotate 4     #  默认保留4个日志文件
create       # 自动创建新的日志文件,新的文件和原来的文件具有相同的权限
dateext      #  日志切割后,文件以当前日志为结尾,例如:messages-20181125
#compress   # 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

include /etc/logrotate.d     # 将/etc/logrotate.d目录中的配置文件加载进来
/var/log/wtmp {           # 针对wtmp日志的配置参数
    monthly                # 每月切割一次
    create 0664 root utmp  # 新建日志的权限为0644,用户为root,组为utmp
    minsize 1M             # 文件大小超过1M后才会切割
    rotate 1               # 只保留1个日志文件
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp    #新建日志的权限为0644,属主为root,属组为utmp
    rotate 1
}

修改配置文件后,并不需要重启服务。 由于 /usr/sbin/logrotate 实际上只是一个可执行文件,不是以 daemon 运行。

/etc/logrotate.d/ 目录:存放自定义日志滚动策略,/etc/logrotate.d/ 目录,通常一些第三方软件包的配置, 如 yum,zabbix-agent,syslog,nginx 等

[root@ziyi logrotate.d]# cat yum
/var/log/yum.log {
    missingok
    notifempty
    maxsize 30k
    yearly
    create 0600 root root
}

常用参数介绍

  1. 切割周期
切割周期,多久切割一次。
daily : 切割周期为 每天
weekly : 切割周期为 每周
monthly : 切割周期为 每月
yearly: 切割周期为 每年
  1. 切割大小
当日志文件到达指定的大小时才转储。
默认单位是 bytes。bytes (缺省) 及 KB (sizek) 或 MB (sizem)
如: size 30k、 size 50M
  1. 日志文件保留个数
日志文件保留备份的个数。默认是 0 。
如:0 指没有备份;5 指保留最近的5个备份,其余的全部删除。
  1. 日志保留天数:maxage 5
保留多少天的日志文件。
如:5 指保留最近的5天的日志文件,其余的全部删除。
如果 日志文件按天转储,则 rotate 与 maxage 基本上是一样的。
  1. 忽略日志转储间的错误
missing ok ,在日志轮循期间,错误将被忽略。
例如 “文件无法找到” 之类的错误。
  1. 日志截断策略
copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断。 把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。
nocopytruncate: 备份日志文件,但是不截断 。
  1. 新生成的日志文件权限
create mode owner group:转储文件,使用指定的文件模式创建新的日志文件。
nocreate: 不建立新的日志文件。
如: create 644 root root
以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。
  1. 是否压缩日志文件
nocompress: 不压缩(默认)
compress: 通过 gzip 压缩转储以后的日志。如 XXX.gz
  1. 是否延迟压缩
delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩。
nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
  1. 日志组脚本:sharedscripts,整个日志组都轮转后执行
共享脚本,整个日志组运行一次脚本 。

比如 nginx 涉及到多个日志文件,一般使用 * 号 通配符:/var/log/nginx/*.log {} ,
sharedscripts 的作用是在 所有的日志文件 都轮转完毕后 统一执行一次脚本 ;
如果没有 sharedscripts ,那么 每个日志文件 轮转完毕后 都会执行一次脚本 。
  1. 空文件日志转存
ifempty :if empty ,即使是空文件也转储(默认)。
notifempty :not if empty ,如果是空文件的话,不转储。
  1. 转存后的日志放入指定位置:
olddir directory :储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统。
noolddir : 转储后的日志文件和当前日志文件放在同一个目录下。
  1. 日期后缀
在日志名称后面,添加日期后缀。默认是当前日期。默认是 -%Y%m%d 的后缀。可用 dateformat 选项扩展配置。

如:nginx_access.log --> nginx_access.log-20210120
注意: 格式化日期中不要出现 分号: ,因为文件名称是不能含有分号的。
  1. 扩展日志后缀
对 dateext 的拓展,必须配合 dateext 使用:

在V3.9.0 之前,只支持 %Y、%m、%d、 %s 参数。
%s 是时间戳。(1970-01-01 00:00:00 UTC以来的秒数)
dateformat -%Y-%m-%d-%s
在V3.9.0 及之后,支持 %H 参数。

在这里插入图片描述

nginx常用配置模版(宝塔安装):

[root@root ~]# cat /etc/logrotate.d/nginx 
  /www/wwwlogs/*.log {       # 日志文件的路径
      # 每天进行日志分割
    daily
    # 启用日期扩展功能
    dateext
    # 设置日期格式,例如:access-logs-2018-11-25
    dateformat -%Y-%m-%d
    # 如果日志文件丢失,则忽略错误
    missingok
    # 保留14份日志文件
    rotate 14
    # 旧日志文件在轮转后进行压缩
    compress
     # 如果日志文件为空,则不进行轮转
    notifempty
     # 创建新日志文件时的权限和所有者
    create 644 www www
    #指定备份日志存储目录
    olddir /www/wwwlogs/weblogs
    sharedscripts           # 整个日志组运行一次脚本
    postrotate
       [ -f /www/server/nginx/logs/nginx.pid ] && kill -USR1 `cat /www/server/nginx/logs/nginx.pid`  # 重启nginx,重新加载日志文件,防止日志无法写入新文件
    endscript              # 结束脚本
  }

调试logrotate

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

尝试执行

 logrotate -f /etc/logrotate.d/nginx

在这里插入图片描述
如果遇到问题,尝试解决,如果不报错就代表运行成功了。

添加crontab任务

添加 crontab 计划任务(在 root 用户下,执行 crontab -e 进入 vim 模式,进行编辑)

[root@ziyi logrotate_mytime]# crontab -e
#每天 0点0分进行日志切割
0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值