本文最后更新于 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/

其他的日志分割的方案

  1. 直接mv messages文件为想要的格式,syslog输出是没有找到会创建新的文件(会触发readonly错误,没有使用

    1. 写一个定时任务,在代码里面加上mv messages messages_$(date +%Y-%m-%d)

  2. 定时修改syslogd的配置文件syslog.config(会触发readonly错误,没有使用

    1. 写一个定时任务,在轮询代码里面加上下面的语句(删除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

    2. 之后重新读取配置文件syslogd -f /mnt/extsd/service/info_lua_service/syslog1.conf

    3. 重启syslog服务syslogd restart