【Linux】logrotate实现日志文件定时分割

问题背景

项目部署的过程中,经常会需要查看程序的执行日志。我之前的做法都是用nohup ... > xxx.log 2>&1 &将日志保存到xxx.log文件中的。但是问题是,程序有时会运行很长时间,一直保存在一个文件里,文件会越来越大,下载、查看都不是很方便。所以就需要一种方法能够定时地将日志文件分割,比如按天分割,每天保存一个。正好Linux系统上的logrotate工具可以实现这个功能。

logrotate是什么?

github:https://github.com/logrotate/logrotate

官方介绍:

The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files. Logrotate can be set to handle a log file hourly, daily, weekly, monthly or when the log file gets to a certain size.

简单来说,就是可以自动地、定时地对日志文件进行轮转、压缩、删除。对于轮转操作,我理解就是对日志文件定时地进行备份、重命名,并生成新的日志文件的过程。

logrotate配置文件

配置文件主要有两部分:

shell 复制代码
# 主配置
/etc/logrotate.conf

# 子配置
/etc/logrotate.d/*

主配置里就是一些全局配置,我在此次实现里没用到,就先不管。

子配置里存放的是不同服务对应的日志文件。比如我有一个springboot服务一直在往nohup.out文件中写文件,现在想用logrotate工具实现日志分割功能,那就可以在/etc/logrotate.d目录下创建一个名字为springboot文件:

shell 复制代码
/etc/logrotate.d/springboot

文件里的具体内容如下:

shell 复制代码
/path/to/nohup.out {
   # 按每天轮转
   daily
   # 保存7个历史备份,即一周
   rotate 7
   # 日志非空时轮转
   notifempty
   # 自动创建新的日志文件,和源文件有相同权限
   create
   # 分割的日志文件的文件名以日期格式结尾
   dateext
}

当然也有其他的配置,具体可以自行百度。

验证配置文件是否编写正确

写好了之后,我不可能等到每天凌晨它启动轮转的时候再去看它是否能够正常工作,那太费时间了。所以就需要手动地先进行验证。

好在logrotate也提供了这样的功能:

  1. sudo logrotate -d /path/to/mylogrotate.conf,用于验证配置文件是否编写正确。如果没有error报错,说明编写正确
  2. sudo logrotate -f /path/to/mylogrotate.conf,用于强制执行轮转,执行后立刻执行轮转,这个时候就能查看是否能分割日志文件了

这里需要注意的是:

  1. 分割的日志文件默认是和轮转的日志文件同级目录的
  2. 由于轮转后会清空日志文件,所以保险起见,一定要先进行备份!!!(对于这种会删除数据、日志等的操作一定都要备份!!)

写配置文件遇到的问题

在写配置文件的时候,发现注释不能和单个配置写在同一行里,否则注释的#符号会被识别成配置,导致报错。正确的写法应该是注释单独写一行,比如:

shell 复制代码
/path/to/nohup.out {
   # 按每天轮转
   daily
   # 保存7个历史备份,即一周
   rotate 7
   # 日志非空时轮转
   notifempty
   # 自动创建新的日志文件,和源文件有相同权限
   create
   # 分割的日志文件的文件名以日期格式结尾
   dateext
}

错误的写法:

shell 复制代码
/path/to/nohup.out {
   daily  # 按每天轮转
   rotate 7  # 保存7个历史备份,即一周
   notifempty  # 日志非空时轮转
   create  # 自动创建新的日志文件,和源文件有相同权限
   dateext  # 分割的日志文件的文件名以日期格式结尾
}
相关推荐
茫忙然几秒前
Linux提权辅助查询工具——BinLens的安装和使用
linux·提权·binlens
FlightYe13 分钟前
linux系统编程(八):阻塞与非阻塞IO对比
android·linux·运维·服务器·github·vim
淮北4941 小时前
ubuntu22 默认输入法调整频率
运维·服务器·git·ubuntu·elasticsearch
土星云SaturnCloud1 小时前
大坝结构安全智能诊断:土星云边缘计算全周期管控实践
服务器·人工智能·安全·ai·边缘计算
Percep_gan1 小时前
切割服务器日志
运维·服务器
农村小镇哥1 小时前
C#读取CSV文件的方法
服务器·数据库·c#
骇客野人1 小时前
阿里云运维手册(通用生产版|云上运维标准化文档)
运维·阿里云·云计算
雾时之林2 小时前
Linux---计算机网络常见面试题
linux·运维·计算机网络
维核科技2 小时前
多卡集群频繁裂卡、通信报错?NVLink故障排查与运维优化方案
运维·服务器维修·gpu维修·算力卡维修·gpu故障·算力卡故障·服务器故障
10mAh2 小时前
【Linux】error while loading shared libraries 怎么解决?——ldd、RPATH 与动态链接排错
java·linux·前端