Linux使用logrotate来切割日志文件

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得非常大,甚至达到GB级别。我在golang应用里使用logrus包来打日志,配置和使用都很方便,就是没有日志分割的功能,应用在线上运行一个月后日志文件都已经达到上百兆。后来发现了logrotate,这是centos自带的日志分割工具,都不用安装额外组件就能实现定时分割日志。

1.运行原理

logrotate默认情况下是通过anacron调用的,它每天只会被调用一次,也就是说一个日志文件默认不会多次被处理(除非-f强制调用或者文件大小超过指定值)。大致调用流程如下:

1).anacron每天去调用/etc/cron.daily中的任务(包含logrotate);

2).anacron调用logrotate后进行日志的处理工作;

3).如果logrotate被手工调用,或者配置文件中有引用,后面的配置记录会覆盖前面相同选项的内容;

1
2
3
4
5
6
7
8
#!/bin/sh
 
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
     /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以看到入口配置文件是/etc/logrotate.conf,依次运行/etc/logrotate.conf.d里的配置文件 如果发现配置的logrotate没有执行,可以看下系统的crond服务有没有开启

logrotate命令详解:

1
2
3
4
5
6
7
8
9
10
logrotate --help
用法:logrotate [-dv] [-f|--force] [-s|--state file] config_file+
什么都不跟则显示版本信息和简单的帮助信息,如果处理过程中出现异常则返回非0的$?;
--?,--help:  显示帮助信息;
-v, --verbose:显示详细信息;
-d, --debug:开启调试模式并隐含开启-v,不会对日志和logrotate的state文件产生操作;
-f, --force:忽略调用周期强制调用logrotate,方便测试;
-m, --mail < command >:告知logrotate发送邮件的命令;
-s, --state < statefile >:多个logrotate运行时告知logrotate自己使用的state文件(/var/lib/logrotate.status)
config_file+:表示可以使用多个配置文件(默认为/etc/logrotate.conf)在后面,最好是在一个配置文件中进行引用(测试某条新的规则时可以单独创建一个配置文件并用-f参数进行强行调用);


2.配置

如果有安装nginx,可以参考nginx里的配置例子

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/nginx/*log {
  create 0644 nginx nginx
  daily
  rotate 10
  missingok
  notifempty
  compress
  sharedscripts
  postrotate
   /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
  endscript
}

第一行定义的是日志文件的路径,可以用*通配,一般可以定义成*.log来匹配所有日志文件。也可以指定多个文件,用空格隔开,比如

1
2
3
/var/log/nginx/access.log /var/log/nginx/error.log {
   
}

花括号里面是日志切割相关的参数,下面是常用的切割参数

  1. compress 是否开启压缩,压缩格式gzip

  2. 不开启压缩

  3. compresscmd 自定义压缩命令

  4. compressexty 压缩文件名后缀

  5. compressoptions 压缩选项

  6. copy 复制一份文件

  7. create 后面跟mode owner group,设置新日志文件的权限

  8. daily 按天分割

  9. weekly 按周分割

  10. monthly 按月分割

  11. rotate 后面跟数字,表示需要保留的文件历史记录,超过数量就会删除,或者通过邮件发送

  12. size 后面跟文件大小,比如100k、100M,超过这个大小后分割

  13. missingok 忽略不存在的文件,不报错

  14. notifempty 不分割空文件

  15. sharedscripts 配合postrotate、prerotate,让他们只执行一次

  16. postrotate/endscript 文件分割完后,执行postrotate、endscript之间的命令

  17. prerotate/endscript 文件分割完前,执行prerotate、endscript之间的命令

下面看几个例子

1
2
3
4
5
6
7
8
9
/var/log/httpd/error.log {
  rotate 5
  mail i@wuyuans.com
  size=100k
  sharedscripts
  postrotate
   /sbin/killall -HUP httpd
  endscript
}

切割/var/log/httpd/error.log日志文件,超过100k后切割,保留最新的5个历史记录,超过5个的邮件发送到fss@qq.com,postrotate里的的命令是为了让httpd重新打开日志文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/var/lib/mysql/mysqld.log {
  # create 600 mysql mysql
  notifempty
  daily
  rotate 3
  missingok
  compress
  postrotate
  # just if mysqld is really running
  if test -x /usr/bin/mysqladmin && \
  /usr/bin/mysqladmin ping &>/dev/null
  then
  /usr/bin/mysqladmin --local flush-error-log \
     flush-engine-log flush-general-log flush-slow-log
  fi
  endscript
}

这是对mysql日志的切割,每天一份,忽略空文件,保留最新3份,使用gzip压缩

1
2
3
4
5
6
7
8
9
10
11
/home/wuyuan/log/*.log {
  su wuyuan wuyuan
  create 0777 wuyuan wuyuan
  daily
  rotate 10
  olddir /home/wuyuan/log/old
  missingok
  postrotate
  endscript
  nocompress
}

这是我在用的配置项,对log目录所有.log文件切割,每天一份,保留10份,新文件设定权限777,历史文件保留在old目录里,这样可以方便查看。因为应用程序用的logrus使用append的方式写日志,所以不需要重新打开日志文件,这点logrus做得很不错。

3.测试

写完配置文件后可以手动执行下,来验证是否可用。

1
logrotate -f /etc/logrotate.d/wuyuan

其中-f 表示强制执行

没问题的话日志就会被移到old目录下,并带上日期,之前的log文件会被清空

本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/1983415如需转载请自行联系原作者


qianghong000

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
23天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
77 1
|
22天前
|
人工智能 安全 Linux
【Linux】Linux之间如何互传文件(详细讲解)
【Linux】Linux之间如何互传文件(详细讲解)
|
16天前
|
存储 监控 安全
Linux系统日志
【4月更文挑战第6天】Linux系统日志,关键用于记录系统状态和事件,包括内核、系统、安全和应用日志,助力管理员诊断问题、确保系统正常运行。日志管理涉及收集、分析、备份等,常用工具如rsyslog、systemd-journal和logrotate(用于日志轮转)。重视日志文件的存储管理,防止空间占用过多。
19 1
Linux系统日志
|
1天前
|
固态存储 Ubuntu Linux
Linux(29) 多线程快速解压缩|删除|监视大型文件
Linux(29) 多线程快速解压缩|删除|监视大型文件
10 1
|
1天前
|
Ubuntu Linux 数据安全/隐私保护
Linux(24) 如何在Ubuntu中操作rootfs.img文件
Linux(24) 如何在Ubuntu中操作rootfs.img文件
2 0
|
5天前
|
运维 Oracle 关系型数据库
Oracle日志文件:数据王国的“记事本”
【4月更文挑战第19天】Oracle日志文件是数据库稳定运行的关键,记录数据变更历史,用于恢复和故障处理。它们协调并发操作,确保数据一致性和完整性。日志文件实时写入操作信息并定期刷新到磁盘,便于数据恢复。然而,日志文件需备份和归档以保证安全性,防止数据丢失。日志文件,数据王国的“记事本”,默默守护数据安全。
|
6天前
|
安全 Linux 开发工具
Linux中可引起文件时间戳改变的相关命令
【4月更文挑战第12天】Linux中可引起文件时间戳改变的相关命令
12 0
|
8天前
|
Linux Shell 开发工具
Linux文件常用操作
Linux文件常用操作(几乎覆盖所有日常使用)
81 0
|
9天前
|
SQL 监控 安全
Linux&Windows 日志分析 陇剑杯 CTF
Linux&Windows 日志分析 陇剑杯 CTF
|
9天前
|
Linux 内存技术 Perl
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件
【ZYNQ】制作从 QSPI Flash 启动 Linux 的启动文件