日志轮转—cron和logrotate

2024-06-23 12:04
文章标签 日志 cron 轮转 logrotate

本文主要是介绍日志轮转—cron和logrotate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

本文介绍如何基于linux系统的cron和logrotate实现日志轮转。cron是一个定时任务管理器,根据配置定时触发任务;logrotate是一个日志轮转工具,根据配置处理日志,logrotate依赖于cron的定时触发。

1.cron

cron是linux系统自带的执行定时任务的工具。cron有3个概念需要区分:cron代表这个软件,crond代表实际运行的进程,crontab用于修改配置文件的客户端工具。cron的核心是配置文件,crond每分钟会读取并比较配置文件时间戳,以确认是否有修改。 该过程是一个热部署,即修改cron配置文件不需要重启crond服务。

1.1 crond服务

crond服务由systemd进行管理,可以参考相关内容, 即可通过systemctl命令查看和启停crond服务:

#停止crond
systemctl stop crond#运行crond
systemctl start/restart crond#查看crond状态
systemctl status crond

service文件路径为:/usr/lib/systemd/system/crond.service,文件内容如下:

[Unit]
Description=Command Scheduler
After=auditd.service systemd-user-sessions.service time-sync.target[Service]
EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=30s[Install]
WantedBy=multi-user.target

通过/usr/sbin/crond -n $CRONDARGS指令启动crond进程。

除了使用linux的systemctl管理crond外,可以手动在命令行中以调试模式打开,如下所示:

[root@host44 ~]# crond -x test
debug flags enabled: test
[3327] cron started
log_it: (CRON 3327) INFO (RANDOM_DELAY will be scaled with factor 0% if used.)
log_it: (CRON 3327) INFO (running with inotify support)
log_it: (CRON 3327) INFO (@reboot jobs will be run at computer's startup.)
...

注意:一个系统中只能运行一个crond程序,通过进程文件/var/run/crond.pid锁住。因此,执行crond -x test需要执行service crond stop闭系统管理的crond。

一般情况下不使用调试模式,可以通过crond日志文件查看执行记录。文件路径为/var/log/cron,记录了定时任务的日志调度记录,包含时间和执行内容,如:

Jun 21 09:29:01 host44 CROND[27228]: (root) CMD (/usr/sbin/logrotate  /etc/logrotate.d/sfums.logrotate)

1.2 crond配置格式

cron读取配置文件后,会根据配置信息执行任务,格式如下所示:

${minute}  ${hour}  ${day}  ${month}  ${week} ${user-name}  ${command to be executed}

其中,minute的取值范围:0 - 59;hour的取值范围: 0-23;day的取值范围: 1-31;month的取值范围: 1-12,week的取值范围:0-7(0和7表示周日).
另外,可用通配符和特殊字符进行配置:常见的有逗号(,)、星号(*)、斜线(/),其中 ,表示枚举, *表示每, /表示增量。

#在每天的1点、3点和5点的第5分钟,以root用户的身份执行(/usr/bin/echo 'hello' >> log.txt)这个命令
5 1,3,5 * * * root /usr/bin/echo 'hello' >> log.txt#每5分钟执行一次指令
*/5 * * * * root /usr/bin/echo 'hello' >> log.txt

与Java中使用的cron表达式类似,本文不进行展开介绍。

1.3 cron配置文件

cron根据用户和执行频率不同,有不同的配置文件路径。

[root@124 etc]# ls -al /etc | grep cron
-rw-r--r--.   1 root root      451 610 2014 crontab
drwxr-xr-x.   2 root root       70 621 14:25 cron.d
drwxr-xr-x.   2 root root       57 621 08:57 cron.daily
drwxr-xr-x.   2 root root       22 621 08:59 cron.hourly
drwxr-xr-x.   2 root root        6 610 2014 cron.monthly
drwxr-xr-x.   2 root root        6 610 2014 cron.weekly

按照章节1-2中格式的定时任务配置完成后,可以写入/etc/crontab文件中,或者单独作为文件放在/etc/cron.d文件夹下。

[root@host44 cron.d]# cat /etc/cron.d/testEwen
*/1 * * * * root /usr/bin/echo "test" >> /test/testEwen.log

同时cron定制了几个特殊的场景,每时/天/周/月,将任务文件放到对应的路径即可。对于每天执行一次的任务,需要将配置文件放到/etc/cron.daily文件夹,如/etc/cron.daily/logrotate文件:

#!/bin/sh/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

crond每天会执行一次logrotate脚本。

说明:以上配置建议用于系统级的定时任务,用户级别的定时任务可在/var/spool/cron/路径下配置,每个用户对应一个文件;如ewen用户对应/var/spool/cron/ewen文件。

1.4 crontab客户端

crontab常用的操作由查询和修改配置。
[1] 使用crontab -l查询当前用户的定时任务配置:

[root@124 cron.d]# crontab -l
*/1 *  * * * /usr/bin/ls >> /test/test1.log

[2] 使用crontab -e修改当前用户的定时任务配置,相当于使用vim打开了/var/spool/cron/用户名文件。

2.logrotate

logrotate为日志管理工具,通过配置,可以实现自动轮转、压缩、删除和邮件日志文件。从而可以避免日志文件无限制地增长,导致耗尽磁盘空间。logrotate的实现依赖于crond服务,即logrotate的每次执行由cron触发。因此,可以从cron的配置中找到logrotate,如下所示:

[root@124 cron.daily]# cat /etc/cron.daily/logrotate
#!/bin/sh/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

由此,crond每天会执行一次/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf指令。
其中:-s /var/lib/logrotate/logrotate.status用于指定日志轮转的状态文件,用于记录文件轮转时间;/etc/logrotate.conf是logrotate的配置文件。/etc/logrotate.conf中核心配置项是include /etc/logrotate.d , 即该配置文件将加载/etc/logrotate.d目录下所有的配置文件,用户可将自己的配置放在该目录下。

2.1 配置文件

logrotate的配置文件格式为文件 {配置信息},可在一个文件中为多个文件配置,如下所示:

/var/log/nginx/*.log {  daily  rotate 7  compress  delaycompress  missingok  notifempty  create 0640 www-data adm  sharedscripts  postrotate  /etc/init.d/nginx reload > /dev/null  endscript  
}

此时配置对/var/log/nginx/路径下所有文件名以log结尾的文件生效。以下对各配置项分别进行介绍:
[1] 日志轮转方式
copytruncate 推荐设置,将日志文件复制后,对原日志文件进行截断(相当于执行>xx.log,情况原日志文件),此时应用程序可以继续写入日志,但截断过程中,可能有数据丢失;
nocopytruncate 不推荐,移动或者重命名日志文件(相当于mv),而不进行日志文件的截断,此时程序可能因无法找到日志文件而报错。

[2] 轮转周期
指定日志轮转的周期,可配置为: daily, weekly, monthly, yearly,分别表示每天一次、每周一次、每月一次和每年一次。

[3] size
指定日志轮转的阈值,当日志文件达到指定大小时才轮转。如size 100M表示日志文件超过100M时触发。

[4] 日志格式
dateext和dateformat参数用于控制备份日志文件的命名方式。不进行配置是,logrotate使用logfile.log.1、logfile.log.2等递增的数组后缀方式命名备份的日志文件。
启用dateext后,添加日期作为扩展名;
dateformat用于自定义日期格式,与dateext配置使用,可以使用%Y(年)、%m(月)、%d(日期)和%s(秒)这四个参数。如:

dateext
dateformat %Y%m%d  

此时,日志格式为logfile.log-20240622。另外,如果不指定dateformat,logrotate通常会使用默认的日期格式(通常是YYYY-MM-DD)。

[5] rotate
保留日志备份的数量,如rotate 5表死会保留最近的5个轮转的日志备份。

[6] 为空是否轮转
ifempty 日志文件为空,也轮转; notifempty 日志文件为空,不轮转。

[7] missingok
如果日志文件丢失,不报错继续执行。

[8] 压缩
compress表示使用gzip压缩轮转后的日志文件;nocompress表示不进行压缩;
delaycompress延迟压缩,下次轮转时才压缩当前轮转的日志文件;nodelaycompress日志轮转时立刻压缩。

[9] create mode owner group
配置轮转日志的属组,设置轮转日志文件的权限和属组,如:create 755 ewen ewen; nocreate表示日志轮转后,不创建新的日志文件。
[10] 轮转触发
prerotate/endscript用于日志轮转前触发:

prerotate// 	操作指令
endscript

postrotate/endscript用于日志轮转后触发:

postrotate// 	操作指令
endscript

2.2 logrotate指令

logrotate [options] <configfile>
常用选项包括:
–force:强制进行日志文件的轮转,即使未达到轮转条件;
–verbose:输出执行过程的详细信息;
–debug:输出debug调试信息;
configfile为logrotate配置文件;初次之外,还可以通过 -s指定status状态文件,status状态文件中保存了每个日志轮转的时间戳。
以下通过简单案例介绍logrotate的使用方式。
准备日志文件

# 创建空的日志文件
touch /test/a.log
echo 12345678 >>/test/a.log

准备logrotate配置文件

# test.conf
/test/*.log {copytruncatesize 10  rotate 7  compresscreate
}

准备logrotate的status文件

touch /test/logrotate.status

执行logroate进行日志轮转

cd /testlogrotate -s logrotate.status test.conf

此时,日志并未进行轮转,如下所示:

[root@VM-4-6-centos nginx]# ls -al
-rw-r--r--  1 root root    9 622 15:59 a.log
-rw-r--r--  1 root root   67 622 15:58 test.conf
-rw-r--r--  1 root root   72 622 16:03 logrotate.status

分析:
由于a.log的大小为9个字节,而logrotate.conf中通过size设置轮转条件为10字节,因此未轮转;可通过 --debug查看详细信息:

[root@VM-4-6-centos nginx]# logrotate -s logrotate.status test.conf --debug
reading config file logrotate.conf
Allocating hash table for state file, size 15360 BHandling 1 logsrotating pattern: /test/a.log 10 bytes (7 rotations)
empty log files are rotated, old logs are removed
considering log /test/a.loglog does not need rotating (log size is below the 'size' threshold)

可通过-f或者–force强制进行日志轮转:

logrotate -s logrotate.status -f  logrotate.conf

查看轮转情况:

[root@VM-4-6-centos nginx]# ll
-rw-r--r-- 1 root root  0 622 16:17 a.log
-rw-r--r-- 1 root root  0 622 16:17 a.log.1
-rw-r--r-- 1 root root 67 622 15:58 logrotate.conf
-rw-r--r-- 1 root root 74 622 16:17 logrotate.status[root@VM-4-6-centos nginx]# cat logrotate.status 
"/test/a.log" 2024-6-22-16:17:27

2.3 logrotate搭配cron运行

章节1.3 cron配置文件可知,crond每天会执行一次/etc/cron.daily/logrotate脚本,该脚本中会触发日志轮转:

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

/etc/logrotate.conf配置文件通过include /etc/logrotate.d加载了 /etc/logrotate.d目录下的配置,即将test.conf放在 /etc/logrotate.d路径下即可实现每天触发一次。

3.案例介绍

基于章节1章节2的介绍,以下根据不同业务场景抽象出三个案例。

3.1 每周触发一次调度

将test.conf文件放在/etc/logrotate.d路径下,test.conf配置文件如下所示:

# test.conf
/test/*.log {copytruncateweeklyrotate 7  compresscreate
}

3.2 每天触发,日志文件达到100M触发

将test.conf文件放在/etc/logrotate.d路径下,test.conf配置文件如下所示:

# test.conf
/test/*.log {copytruncatesize 100Mrotate 7  compresscreate
}

3.3 每周触发一次,如果超过100M才触发

准备logrotate配置文件:
将test.conf文件放在/test路径下,test.conf配置文件如下所示:

# test.conf
/test/*.log {copytruncatesize 100Mrotate 7  compresscreate
}

为crond添加配置文件:
在/etc/cron.weekly目录下添加配置文件test, 配置内容如下:

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /test/test.conf

这篇关于日志轮转—cron和logrotate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087104

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log

android两种日志获取log4j

android   log4j 加载日志使用方法; 先上图: 有两种方式: 1:直接使用架包 加载(两个都要使用); 架包:android-logging-log4j-1.0.3.jar 、log4j-1.2.15.jar  (说明:也可以使用架包:log4j-1.2.17.jar)  2:对架包输入日志的二次封装使用; 1:直接使用 log4j 日志框架获取日志信息: A:配置 日志 文