【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  # 分割的日志文件的文件名以日期格式结尾
}
相关推荐
测试员周周16 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
小辰记事本18 小时前
从零读懂RoCEv2数据包构造:从WQE到线缆上的完整旅程
服务器·网络·网络协议·rdma
小鹏linux19 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
在角落发呆19 小时前
Linux转发配置:解锁网络互联的核心密码
linux·运维·网络
齐潇宇19 小时前
Zabbix 7 概述与配置
linux·zabbix·监控告警
裴东青21 小时前
10-实战:RuoYi-Cloud的自动化发布
运维·ci/cd·自动化
江公望21 小时前
Ubuntu htop命令,10分钟讲清楚
linux·服务器
哎呦,帅小伙哦21 小时前
Linux 时间:从原子钟到 clock_gettime 的每一面
linux·运维·服务器
sxgzzn21 小时前
新能源场站数智化转型:基于数字孪生与AI的智慧运维管理平台解析
大数据·运维·人工智能
张小姐的猫21 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++