Linux 日志管理 logrotate(日志滚动)

logrotate:日志管理工具

1 概念:切割日志&删除旧日志

logrotate软件是一个日志管理工具,用于 切割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般centos系统已经自带安装好了。

  • 日志滚动

logrotate是基于 crontab (定时任务)运行的,运行时,logrotate 会调用配置文件 /etc/logrotate.conf 。可以在 /etc/logrotate.d 目录里放置自定义好的配置文件,用来覆盖 logrotate.conf 的缺省值。

# 查看版本
logrotate --version

在这里插入图片描述

2 配置logrotate

2.1 配置方式:logrotate.conf+logrotate.d/*.conf

默认执行脚本: /usr/sbin/logrotate
默认配置文件: /etc/logrotate.conf
自定义配置目录: /etc/logrotate.d/*.conf

/etc/logrotate.conf 通过 include 指令,会引入 /etc/logrotate.d 目录下的自定义的配置文件。

①/etc/logrotate.conf:存放默认日志策略(里面会导入自定义日志配置)

在/etc/logrotate.conf该配置文件中通过:include /etc/logrotate.d ,将自定义日志滚动策略添加到配置文件

# 查看默认配置文件
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
}

# system-specific logs may be also be configured here.

修改配置文件后,并不需要重启服务。 由于 /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
}

在这里插入图片描述

2.2 常用参数

1. 切割周期:daily、weekly、monthly、yearly

切割周期,多久切割一次。
daily : 切割周期为 每天
weekly : 切割周期为 每周
monthly : 切割周期为 每月
yearly: 切割周期为 每年

2. 切割大小:size 30k、size 100M

当日志文件到达指定的大小时才转储。
默认单位是 bytes。bytes (缺省) 及 KB (sizek) 或 MB (sizem)
如: size 30k、 size 50M

3. 日志文件保留个数:rotate 2(保留两份),默认为0不保留

日志文件保留备份的个数。默认是 0 。
如:0 指没有备份;5 指保留最近的5个备份,其余的全部删除。

4. 日志保留天数:maxage 5(保留最近5天日志)

保留多少天的日志文件。
如:5 指保留最近的5天的日志文件,其余的全部删除。
如果 日志文件按天转储,则 rotate 与 maxage 基本上是一样的。

5. 排除指定后缀文件:tabooext [+] list,不转存.xxx文件

让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~

6. 忽略日志转储间的错误:missing ok

missing ok ,在日志轮循期间,错误将被忽略。
例如 “文件无法找到” 之类的错误。

7. 日志截断策略:copytruncate备份截断、nocopytruncate不截断

  • copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断。 把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。
  • nocopytruncate: 备份日志文件,但是不截断 。

8. 新生成的日志文件权限:create 644 root root

create mode owner group:转储文件,使用指定的文件模式创建新的日志文件。
nocreate: 不建立新的日志文件。
如: create 644 root root
以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。

9. 是否压缩日志文件:nocompress、compress

  • nocompress: 不压缩(默认)
  • compress: 通过 gzip 压缩转储以后的日志。如 XXX.gz

10. 是否延迟压缩:delaycompress(转存并下次压缩)、nodelaycompress(转存直接压缩)

  • delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩。
  • nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。

11. 转存前操作:prerotate endscript

在所有其它指令完成 前 执行。这两个关键字必须单独成行

12. 转存后操作:postrotate endscript

在所有其它指令完成 后 执行。这两个关键字必须单独成行

13. 日志组脚本:sharedscripts,整个日志组都轮转后执行

共享脚本,整个日志组运行一次脚本 。

  • 比如 nginx 涉及到多个日志文件,一般使用 * 号 通配符:/var/log/nginx/*.log { … } ,
  • sharedscripts 的作用是在 所有的日志文件 都轮转完毕后 统一执行一次脚本 ;
  • 如果没有 sharedscripts ,那么 每个日志文件 轮转完毕后 都会执行一次脚本 。

14. 转存错误时发送信息到指定email:errors 123@qq.com

转储时的错误信息发送到指定的 Email 地址。

15. 转存的日志文件发送到指定email:mail 123@qq.com

  • mail address : 把转储的日志文件发送到指定的 E-mail 地址
  • nomail : (默认)转储时不发送日志文件

16. 空文件日志转存:ifempty(空文件转存)、notifempty(空文件不转存)

  • ifempty :if empty ,即使是空文件也转储(默认)。
  • notifempty :not if empty ,如果是空文件的话,不转储。

17. 转存后的日志放入指定位置:olddir directory 、noolddir(和当前日志文件放在同一目录)

  • olddir directory :储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统。
  • noolddir : 转储后的日志文件和当前日志文件放在同一个目录下。

18. 日期后缀:dateext(转存的日志名称后添加 -%Y%m%d )

在日志名称后面,添加日期后缀。默认是当前日期。默认是 -%Y%m%d 的后缀。可用 dateformat 选项扩展配置。

  • 如:nginx_access.log --> nginx_access.log-20210120
    注意: 格式化日期中不要出现 分号: ,因为文件名称是不能含有分号的。

19. 扩展日志后缀:dateformat

对 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 参数。

如: dateformat -%Y-%m-%d
结果:nginx_access.log --> nginx_access.log-2021-01-20
注意: 文件名称中禁止出现分号: ,因为文件名称是不能含有分号的。

20. 转存日志提前一天:dateyesterday(当前是2024-01-20,提前后为2024-01-19)

与 dateext 配合使用,日期提前一天。
比如,当前日期是2024-01-20,提前一天就是 2024-01-19

21. 转存后新增日志后缀:extension .log(转存后为xxx.log)

与 dateext 、dateformat 配合使用,指定文件的后缀。
如:extension .log
结果:nginx_access.log --> nginx_access-2021-01-20.log
说明:nginx_access.log , 文件名是nginx_access,后缀是.log, 文件名 + -%Y-%m-%d 格式的日期 + .log 后缀,结果是 nginx_access-2021-01-20.log

2.3 Q&A问题解析

1. rotate (按照个数滚动)和 maxage (按照天滚动)

它们都是用来控制保存多少日志文件的,

  • 区别在于rotate是以个数为单位的
  • 而maxage是以天数为单位的。
    如果我们是以按天来轮转日志,那么二者的差别就不大了。

2. create(新建文件,重新打开日志,默认选项) 和 copytruncate(拷贝日志,清空之前日志) 的区别

  • create(默认):新建文件,将原来日志重命名,通知程序重新打开文件。(部分程序可能不支持重新打开日志文件,因此需要copytruncate)
  • copytruncate:拷贝日志,清空之前日志。日志过大copy耗时,可能导致部分日志丢失。但无需程序重新打开日志文件,更通用。
  1. create:默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是 重命名原日志文件,创建新的日志文件。
  • 重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
  • 创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。
  • 最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。

这也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了 copytruncate 方式。

  1. copytruncate(复制、清空):该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志
  • 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
  • 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。

如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。

2.4 dateformat配置案例(nginx为例)

vim /etc/logrotate.d/nginx 

/etc/logrotate.d/nginx :

/var/log/nginx/*.log {
 # 每天进行日志分割
    daily                  
    # 启用日期扩展功能
    dateext              
    # 设置日期格式,例如:access-logs-2018-11-25   
    dateformat -%Y-%m-%d
    # 如果日志文件丢失,则忽略错误
    missingok       
    # 保留30份日志文件       
    rotate 30         
    # 旧日志文件在轮转后进行压缩      
    compress         
     # 如果日志文件为空,则不进行轮转       
    notifempty          
     # 创建新日志文件时的权限和所有者   
    create 644 root root 
}
# 模拟日志轮转
logrotate  --force /etc/logrotate.d/nginx

在这里插入图片描述

nginx常用配置模版:

[root@root ~]# cat /etc/logrotate.d/nginx 
  /var/log/nginx/*.log {       # 日志文件的路径
        daily                   # 每天进行日志分割
        dateext                 # 日志切割后,文件以当前日志为结尾,例如:access-logs-20181125
        missingok               # 日志不存在分析,分析下一个
        rotate 30               # 日志保留30份 
        compress                # 转存之后压缩.tar.gz
        delaycompress           # 日志压缩会被延后到下次分割时进行
        notifempty              # 空文件不转储
        create 644 nginx nginx  # 新日志文件权限
        sharedscripts           # 整个日志组运行一次脚本
        postrotate
            [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`  # 重启nginx,重新加载日志文件,防止日志无法写入新文件 
        endscript              # 结束脚本
  }

3 调试logrotate

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

/var/log/nginx/*.log {
 # 每天进行日志分割
    daily
    # 启用日期扩展功能
    dateext
    # 设置日期格式,例如:access-logs-2018-11-25
    dateformat -%Y-%m-%d
    # 如果日志文件丢失,则忽略错误
    missingok
    # 保留30份日志文件
    rotate 30
    # 旧日志文件在轮转后进行压缩
    compress
     # 如果日志文件为空,则不进行轮转
    notifempty
     # 创建新日志文件时的权限和所有者
    create 644 root root
}

3.1 logrotate -d /etc/logrotate.d/nginx(debug操作,但不会真正执行日志滚动流程)

  • 并不会真正进行 rotate 或者 compress 操作,但是会打印出整个执行的流程,和调用的脚本等详细信息。

在这里插入图片描述

3. 2 logrotate -v /etc/logrotate.d/nginx(执行转存操作并打印详细信息)

verbose(冗长的、啰嗦的):会真正执行操作,打印出详细信息。

在这里插入图片描述

3.3 logrotate -f /etc/logrotate.d/nginx(强制执行转存)

force(强制执行):如果时间不符合要求,logrotate 也不会真正执行时,如果想要立即执行,查看结果,就使用到了 强制执行模式。

在这里插入图片描述

4 crontab:精准执行日志滚动

logrotate 执行切割的时间有一定的随机性,如果对时间要求特别严格,则推荐使用 crontab 来定时执行 logrotate 文件。

4.1 创建logrotate_mytime/nginx_rotate文件

在 非 /etc/logrotate.d/ 下创建目录,存放 logrotate 配置文件。
例如,在 /etc 目录下创建 logrotate_mytime 目录, 然后 ,将 nginx 的 logrotate 的配置文件 nginx_rotate,放到 /etc/logrotate_mytime 目录下。

mkdir -p /etc/logrotate_mytime
cd /etc/logrotate_mytime

将nginx日志滚动配置放在该目录下:

vim nginx_rotate


/var/log/nginx/*.log {
 # 每天进行日志分割
    daily
    # 启用日期扩展功能
    dateext
    # 设置日期格式,例如:access-logs-2018-11-25
    dateformat -%Y-%m-%d
    # 如果日志文件丢失,则忽略错误
    missingok
    # 保留30份日志文件
    rotate 30
    # 旧日志文件在轮转后进行压缩
    compress
     # 如果日志文件为空,则不进行轮转
    notifempty
     # 创建新日志文件时的权限和所有者
    create 644 root root
}

在这里插入图片描述

4.2 添加crontab任务

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

[root@ziyi logrotate_mytime]# crontab -e
# 每分钟执行
* * * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate

#每天 23点59分进行日志切割
#59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate

在这里插入图片描述

如果用非root用户则会报错error: error creating output file /var/lib/logrotate/logrotate.status.tmp: 权限不够 。
说明:

  • 如果 crontab 中定义的执行时间是0点整,建议在 nginx_rotate 里添加上 dateyesterday 选项,因为,日志内容记录的是昨天的,日志名称却是今天的,容易引起歧起。
  • 如果 crontab 中定义的执行时间是23点59分,则不用添加 dateyesterday 选项,因为名称和内容都是当天的,是一致的。

4.3 查看并重启crontab

# 查看所有定时任务
crontab -l

# 编辑定时任务
#crontab -e   


# centos6: 
service crond restart

# centos7: 
systemctl restart crond 

在这里插入图片描述

观察定时任务是否生效:
在这里插入图片描述

5 常见日志配置

5.1 nginx(create方式)

/var/log/nginx/*.log {   # 可以指定多个路径
    daily                      # 日志轮询周期,weekly,monthly,yearly
    rotate 30                  # 保存30天数据,超过的则删除
    size 100M                 # 超过100M时分割,单位K,M,G,优先级高于daily
    
    compress                   # 切割后压缩,也可以为nocompress
    delaycompress              # 切割时对上次的日志文件进行压缩
    
    dateext                    # 日志文件切割时添加日期后缀
    dateformat -%Y-%m-%d
    
    missingok                  # 如果没有日志文件也不报错
    notifempty                 # 日志为空时不进行切换,默认为ifempty
    create 640 nginx nginx     # 使用该模式创建日志文件
    
    sharedscripts              # 所有的文件切割之后只执行一次下面脚本
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

5.2 nginx(copytruncate方式)

/var/log/nginx/*.log {
	daily
	rotate 30
	missingok
    notifempty
    
	olddir nginx_archive
	
	dateext
	dateformat -%Y-%m-%d
	dateyesterday
	
    copytruncate		
}

参考文章:https://blog.csdn.net/xiaojin21cen/article/details/122309230

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值