Logrotate日志分割
本文最后更新于 2023-07-07,文章内容可能已经过时。
写入Logrotate
已有此工具直接阅读下一部分
由于板子存储空间有限所以只包含简单的工具,需要在TinaLinux上将logrotate放入镜像并烧录写入板子里
步骤
make menuconfig
Utilities ---> logrotate..................... rotates, compresses, and mails system logs
Libraries ---> libpopt............................ A command line option parsing library
将上述两个选项设为y后make && pack
生成的镜像用烧录工具烧入内存卡中,再放入板子中等待写入完成即可使用
Logrotate工具使用
参数介绍
logrotate -d /etc/logrotate.conf 表示调试,不会真正执行,会提示分割规则的分割结果或者语法错误
logrotate -s /mnt/extsd/xxx/logrotate.status ,-s表示分割工具自身的日志存放位置,默认为/var/lib/logrotate.status,没有lib文件夹不会自动创建而是直接报错
logrotate /etc/logrotate.conf 不带参数即为直接执行
logrotate -v /etc/logrotate.conf 执行,并把执行过程打印出来
logrotate -f /etc/logrotate.conf 即使不符合分割条件也强制执行
配置文件
/etc/logrotate.conf文件,加入该工具后自动在/etc目录中生成,内容为分割规则的默认配置,并定义了存放分割规则的文件夹/etc/logrotate.d,这个文件夹的位置可以更换
# rotate log files weekly 执行时间,每周 每日 每小时hourly
weekly
#daily
# keep 4 weeks worth of backlogs 存放日志文件的时间
rotate 4
# create new (empty) log files after rotating old ones 分割方案,将目标文件重命名为配置的格式之后再新建一个目标文件
create
#olddir /var/log/backup/ 指定分割后的文件存放位置
#dateext 以日期命令
# uncomment this if you want your log files compressed 是否需要压缩分割后的文件
#compress
# packages can drop log rotation information into this directory 存放分割规则的文件夹,会把里面的规则加载进来
include /etc/logrotate.d
# no packages own lastlog or wtmp -- we'll rotate them here 也可以直接在这个配置文件里面写分割规则
#/var/log/wtmp {
# monthly
# create 0664 root utmp
# rotate 1
#}
# system-specific logs may be also be configured here.
实际使用中除了include /etc/logrotate.d都注释了,因为基本这些都需要自己定义
/etc/logrotate.d 这个文件夹下面放的是自建的分割规则文件
例:/etc/logrotate.d/messages 分割规则文件内容
/mnt/extsd/logs/messages{
size 150k
rotate 30
copytruncate
create
dateext
dateformat _%Y-%m-%d-%H_%s
postrotate
/bin/kill -HUP 'cat /var/run/syslogd.pid 2> /dev/null' 2> /dev/null || true
endscript
}
第一行表示分割的文件,可以写多个文件,用空格分割即可
size 表示分割的最小大小
rotate 表示分割的日志文件最多存放几个
copytruncate 表示将目标文件复制出来后将目标文件清空
dateext 表示用日期来作为文件后缀
dateformat 为自己指定日期的格式,使用这个参数必须有dateext ,并且目前只支持%Y-%m-%d-%H_%s这几个参数,分别为年份-月份-天-小时-1970至今分钟数
postrotate,endscript 这两个词需要单独成行,中间的内容表示分割完成后要执行的语句,此处的语句是重启syslog服务,使他写的文件指向新的messages文件
更详细的信息见https://blog.csdn.net/yhc166188/article/details/104010973
配合cron定时任务
logrotate本身有定时执行功能但是只能指定每小时每天或每周,由于cron自由度更高故使用
cron已经集成在系统中,会每分钟读取并执行/etc/crontabs/root里的任务规则
59 23 * * * logrotate -vf /etc/logrotate.conf -s /mnt/xxx/xxx/$(sec_key -r PACK_VER | cut -d '=' -f 2)/xxx/logrotate.status
*/20 * * * * logrotate -v /etc/logrotate.conf -s /mnt/xxx/xxx/$(sec_key -r PACK_VER | cut -d '=' -f 2)/xxx/logrotate.status
语句之前的一串即为cron表达式
第一行表示每天23点59分强制执行分割任务
第二行表示每二十分钟执行日志分割任务
cron表达式浅析
各个位置分别表示分钟 小时 日期 月份 星期 年,并有以下表达形式
*表示所有
a,b表示仅a和b值会执行
a-b表示取a到b值(包含)之间所有的值
a/b表示阶跃值,如第一个参数为*/20则表示每二十分钟,可以和-连用,如第一个参数设置为0-40/20则表示0到40分钟每二十分钟,即00,20,40分都会执行
验证和查看cron表达式规则:https://crontab.guru/
其他的日志分割的方案
直接mv messages文件为想要的格式,syslog输出是没有找到会创建新的文件(会触发readonly错误,没有使用
写一个定时任务,在代码里面加上
mv messages messages_$(date +%Y-%m-%d)
定时修改syslogd的配置文件syslog.config(会触发readonly错误,没有使用
写一个定时任务,在轮询代码里面加上下面的语句(删除syslog.conf中包含messages的那段文本,添加需要的messages名字)
sed -i '/message/d' /mnt/extsd/service/info_lua_service/syslog.conf
echo \"*.info /mnt/extsd/logs/messages_$(date +%Y-%m-%d)\" >> /mnt/extsd/service/info_lua_service/syslog.conf
之后重新读取配置文件
syslogd -f /mnt/extsd/service/info_lua_service/syslog1.conf
重启syslog服务
syslogd restart