【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  # 分割的日志文件的文件名以日期格式结尾
}
相关推荐
狄加山67543 分钟前
Linux Input子系统与驱动开发实战
linux·运维·驱动开发
小刘|44 分钟前
对称加密以及非对称加密
linux·运维·网络
Levin__NLP_CV_AIGC3 小时前
更新 / 安装 Nvidia Driver 驱动 - Ubuntu - 2
linux·运维·ubuntu
DLR-SOFT3 小时前
Windows远程访问Ubuntu的方法
linux·运维·ubuntu
咸鱼2333号程序员3 小时前
Linux ifconfig命令详解
linux·服务器·网络
秦jh_4 小时前
【Linux网络】应用层协议HTTP
linux·运维·服务器·网络·网络协议·tcp/ip·http
利刃大大4 小时前
【网络编程】四、守护进程实现 && 前后台作业 && 会话与进程组
linux·网络·c++·网络编程·守护进程
何怀逸4 小时前
安装 Docker
运维·docker·容器
杰克逊的日记5 小时前
运维体系架构规划
运维·架构
pp-周子晗(努力赶上课程进度版)5 小时前
【计算机网络-数据链路层】以太网、MAC地址、MTU与ARP协议
服务器·网络·计算机网络