Linux日志管理工具:Logrotate(一):https://developer.aliyun.com/article/1582124
4. 高级配置技巧
4.1 使用通配符匹配多个日志文件
在实际的系统管理中,我们经常需要同时处理多个相关的日志文件。Logrotate提供了强大的通配符功能,使得我们可以用一个配置块来管理多个日志文件,大大简化了配置过程。
通配符的使用方法非常直观。例如,要轮转/var/log
目录下所有以".log"结尾的文件,可以这样配置:
# /etc/logrotate.d/general-logs # 这是用于管理通用日志文件的Logrotate配置文件 # 匹配/var/log/目录下所有以.log结尾的文件 /var/log/*.log { # 每周轮转一次日志 weekly # 保留4个轮转后的日志文件 rotate 4 # 压缩轮转后的日志文件 compress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty }
这个配置会匹配/var/log
目录下所有以".log"结尾的文件,对它们应用相同的轮转策略。
更复杂的匹配模式也是可能的。比如,要匹配多个子目录下的日志文件,可以使用如下配置:
/var/log/**/*.log { daily rotate 7 compress missingok notifempty }
这个配置会匹配/var/log及其所有子目录下的".log"文件。
需要注意的是,使用通配符时要格外小心,确保不会意外匹配到不应该轮转的文件。同时,过于宽泛的通配符可能会导致性能问题,特别是在处理大量文件时。
4.2 为不同类型的日志设置不同的轮转策略
在一个复杂的系统中,不同类型的日志可能需要不同的轮转策略。Logrotate允许我们在一个配置文件中为不同的日志文件设置不同的策略。
例如,我们可能希望对系统日志进行每日轮转,而对应用日志进行每周轮转。可以这样配置:
# /etc/logrotate.d/syslog # 这是用于管理系统日志文件的Logrotate配置文件 # 匹配/var/log/syslog文件 /var/log/syslog { # 每天轮转一次日志 daily # 保留7个轮转后的日志文件 rotate 7 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 在日志轮转结束后执行的脚本 postrotate # 重新加载rsyslog服务,确保其重新打开日志文件 /usr/lib/rsyslog/rsyslog-rotate # 脚本结束 endscript } # /etc/logrotate.d/myapp # 这是用于管理myapp应用日志文件的Logrotate配置文件 # 匹配/var/log/myapp/目录下所有以.log结尾的文件 /var/log/myapp/*.log { # 每周轮转一次日志 weekly # 保留4个轮转后的日志文件 rotate 4 # 压缩轮转后的日志文件 compress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty }
在这个配置中,系统日志/var/log/syslog
每天轮转一次,保留7个旧文件。而应用日志/var/log/myapp/*.log
每周轮转一次,只保留4个旧文件。
我们还可以根据文件大小来设置不同的轮转策略。例如:
# /etc/logrotate.d/large_app # 这是用于管理large_app日志文件的Logrotate配置文件 # 匹配/var/log/large_app.log文件 /var/log/large_app.log { # 当日志文件达到100MB时进行轮转 size 100M # 保留10个轮转后的日志文件 rotate 10 # 压缩轮转后的日志文件 compress } # /etc/logrotate.d/small_app # 这是用于管理small_app日志文件的Logrotate配置文件 # 匹配/var/log/small_app.log文件 /var/log/small_app.log { # 当日志文件达到10MB时进行轮转 size 10M # 保留5个轮转后的日志文件 rotate 5 # 压缩轮转后的日志文件 compress }
这里,large_app.log
在达到100MB时进行轮转,而small_app.log
在达到10MB时进行轮转。
4.3 配置邮件通知
在某些情况下,我们可能希望在日志轮转发生时收到通知。Logrotate提供了邮件通知功能,可以在轮转完成后发送邮件。
要启用邮件通知,可以使用mail
选项。例如:
# /etc/logrotate.d/critical_app # 这是用于管理critical_app日志文件的Logrotate配置文件 # 匹配/var/log/critical_app.log文件 /var/log/critical_app.log { # 每天轮转一次日志 daily # 保留30个轮转后的日志文件 rotate 30 # 压缩轮转后的日志文件 compress # 在日志轮转后发送邮件通知 mail admin@example.com # 发送最新的日志文件而不是最旧的 mailfirst }
在这个配置中,每次critical_app.log
被轮转时,都会向admin@example.com
发送一封邮件。mailfirst
选项指定发送最新的日志文件,而不是最旧的。
如果只想在出现错误时收到通知,可以使用errors
选项:
# /etc/logrotate.d/app # 这是用于管理应用程序日志文件的Logrotate配置文件 # 匹配/var/log/app.log文件 /var/log/app.log { # 每周轮转一次日志 weekly # 保留4个轮转后的日志文件 rotate 4 # 压缩轮转后的日志文件 compress # 如果在轮转过程中出现错误,发送邮件通知管理员 errors admin@example.com }
这样,只有在轮转过程中出现错误时,才会发送邮件通知。
4.4 使用脚本进行自定义操作
Logrotate的一个强大特性是允许在轮转过程的不同阶段执行自定义脚本。这为日志管理提供了极大的灵活性。
主要有两种类型的脚本:prerotate
和postrotate
。prerotate
脚本在日志轮转之前执行,而postrotate
脚本在日志轮转之后执行。
例如,我们可能需要在轮转Nginx日志之后重新打开日志文件:
# /etc/logrotate.d/nginx # 这是用于管理Nginx日志文件的Logrotate配置文件 # 匹配/var/log/nginx/目录下所有以.log结尾的文件 /var/log/nginx/*.log { # 每天轮转一次日志 daily # 保留7个轮转后的日志文件 rotate 7 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 创建新的日志文件,设置权限为0640,所有者为nginx,组为adm create 0640 nginx adm # 所有日志文件轮转完毕后,只执行一次脚本 sharedscripts # 在日志轮转结束后执行的脚本 postrotate # 如果Nginx的PID文件存在 if [ -f /var/run/nginx.pid ]; then # 向Nginx发送USR1信号,使其重新打开日志文件 kill -USR1 `cat /var/run/nginx.pid` fi # 脚本结束 endscript }
在这个配置中,postrotate
脚本会在日志轮转后向Nginx进程发送一个USR1信号,使其重新打开日志文件。
我们还可以使用脚本来执行更复杂的操作,比如在轮转之前备份日志文件:
# /etc/logrotate.d/myapp # 这是用于管理myapp日志文件的Logrotate配置文件 # 匹配/var/log/目录下的myapp.log文件 /var/log/myapp.log { # 每天轮转一次日志 daily # 保留7个轮转后的日志文件 rotate 7 # 压缩轮转后的日志文件 compress # 在日志轮转之前执行的脚本 prerotate # 如果/backup目录存在 if [ -d /backup ]; then # 将当前的myapp.log文件复制到/backup目录,并重命名为myapp-YYYYMMDD.log cp /var/log/myapp.log /backup/myapp-$(date +%Y%m%d).log fi # 脚本结束 endscript }
这个prerotate
脚本会在日志轮转之前将当前的日志文件复制到备份目录。
5. 常见应用服务的Logrotate配置示例
在实际的系统运维中,我们经常需要为各种不同的应用服务配置日志轮转。每种服务都有其特定的日志特征和管理需求。本节将介绍几个常见应用服务的Logrotate配置示例,包括Web服务器、数据库和系统日志。这些示例可以作为您配置自己的服务时的参考和起点。
5.1 Apache/Nginx Web服务器
Web服务器通常会生成大量的访问日志和错误日志。这些日志对于流量分析、问题排查和安全审计都至关重要。以下是一个适用于Nginx Web服务器的Logrotate配置示例:
# /etc/logrotate.d/nginx # 这是用于管理Nginx日志文件的Logrotate配置文件 # 匹配/var/log/nginx/目录下所有以.log结尾的文件 /var/log/nginx/*.log { # 每天轮转一次日志 daily # 如果日志文件不存在,不报错继续执行 missingok # 保留14个轮转后的日志文件 rotate 14 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件为空,则不轮转 notifempty # 创建新的日志文件,设置权限为0640,所有者为nginx,组为adm create 0640 nginx adm # 所有日志文件轮转完毕后,只执行一次脚本 sharedscripts # 在日志轮转结束后执行的脚本 postrotate # 如果Nginx的PID文件存在 if [ -f /var/run/nginx.pid ]; then # 向Nginx发送USR1信号,使其重新打开日志文件 kill -USR1 `cat /var/run/nginx.pid` fi # 脚本结束 endscript }
这个配置适用于/var/log/nginx/目录下的所有日志文件。它的主要特点包括:
每日轮转:daily选项确保日志每天都会被轮转,便于按日期组织和分析日志。
保留两周的日志:rotate 14指定保留14个轮转后的日志文件,相当于两周的历史记录。
压缩旧日志:compress选项会压缩旧的日志文件以节省空间,而delaycompress则延迟压缩最近的一个日志文件,便于即时查看。
创建新日志文件:create 0640 nginx adm在轮转后创建新的日志文件,并设置适当的权限和所有者。
重新打开日志文件:postrotate脚本在轮转完成后向Nginx发送USR1信号,使其重新打开日志文件。这确保了Nginx能够继续正确地写入新的日志文件。
5.2 MySQL数据库
数据库的日志对于性能调优和问题诊断非常重要。以下是一个适用于MySQL数据库的Logrotate配置示例:
# /etc/logrotate.d/mysql # 这是用于管理MySQL日志文件的Logrotate配置文件 # 匹配/var/log/mysql/目录下所有以.log结尾的文件 /var/log/mysql/*.log { # 每周轮转一次日志 weekly # 保留12个轮转后的日志文件 rotate 12 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 创建新的日志文件,设置权限为0640,所有者为mysql,组为adm create 0640 mysql adm # 所有日志文件轮转完毕后,只执行一次脚本 sharedscripts # 在日志轮转结束后执行的脚本 postrotate # 检查/usr/bin/mysqladmin是否存在且可执行,并且MySQL服务器正在运行 if test -x /usr/bin/mysqladmin && \ /usr/bin/mysqladmin ping &>/dev/null then # 刷新MySQL日志文件 /usr/bin/mysqladmin flush-logs fi # 脚本结束 endscript }
这个配置针对/var/log/mysql/目录下的所有MySQL日志文件。它的主要特点包括:
每周轮转:weekly选项设置每周进行一次日志轮转,这通常足以满足大多数数据库的需求。
保留三个月的日志:rotate 12指定保留12个轮转后的日志文件,相当于约三个月的历史记录。
压缩旧日志:与Nginx配置类似,使用compress和delaycompress选项来压缩旧日志文件。
刷新日志:postrotate脚本在轮转完成后执行mysqladmin flush-logs命令,这会让MySQL关闭当前的日志文件并打开一个新的日志文件。
5.3 系统日志
系统日志记录了操作系统层面的各种事件,对于系统管理和安全监控至关重要。以下是一个适用于系统日志的Logrotate配置示例:
# /etc/logrotate.d/syslog # 这是用于管理系统日志文件的Logrotate配置文件 # 匹配/var/log/syslog文件 /var/log/syslog { # 保留7个轮转后的日志文件 rotate 7 # 每天轮转一次日志 daily # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 压缩轮转后的日志文件 compress # 在日志轮转结束后执行的脚本 postrotate # 重新加载rsyslog服务,确保其重新打开日志文件 /usr/lib/rsyslog/rsyslog-rotate # 脚本结束 endscript } # 匹配多个常见的系统日志文件 /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { # 保留4个轮转后的日志文件 rotate 4 # 每周轮转一次日志 weekly # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 所有日志文件轮转完毕后,只执行一次脚本 sharedscripts # 在日志轮转结束后执行的脚本 postrotate # 重新加载rsyslog服务,确保其重新打开日志文件 /usr/lib/rsyslog/rsyslog-rotate # 脚本结束 endscript }
这个配置分为两部分,分别处理主系统日志文件和其他各种系统日志文件。主要特点包括:
对主系统日志(/var/log/syslog)进行每日轮转,保留一周的历史记录。
对其他系统日志进行每周轮转,保留四周的历史记录。
使用compress和delaycompress选项压缩旧日志文件。
在轮转后执行/usr/lib/rsyslog/rsyslog-rotate脚本,这个脚本会重新加载rsyslog服务,确保日志继续正确记录。
6. Logrotate与其他工具的集成
6.1 与Cron的配合使用
Logrotate虽然是一个强大的日志管理工具,但它本身并不是一个持续运行的守护进程。相反,它被设计为定期执行的任务。这就是Logrotate与Cron配合使用的重要性所在。Cron是类Unix系统中的一个时间调度器,它能够在指定的时间间隔内自动执行命令或脚本。通过将Logrotate与Cron结合使用,我们可以确保日志轮转任务按照预定的时间表定期执行,从而实现自动化的日志管理。
在大多数Linux发行版中,Logrotate的Cron作业已经预先配置好了。通常,这个作业被设置为每天运行一次。你可以在/etc/cron.daily/
目录中找到名为"logrotate"的脚本。这个脚本通常包含类似以下的内容:
#!/bin/sh # 这是一个用于执行Logrotate的脚本 # 运行Logrotate,使用指定的配置文件/etc/logrotate.conf /usr/sbin/logrotate /etc/logrotate.conf # 获取Logrotate命令的退出状态码 EXITVALUE=$? # 如果退出状态码不为0,表示Logrotate执行过程中出现了错误 if [ $EXITVALUE != 0 ]; then # 使用logger命令记录一条日志,日志级别为ALERT,内容为Logrotate异常退出的状态码 /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi # 脚本正常结束,返回状态码0 exit 0
这个脚本每天执行一次Logrotate,使用/etc/logrotate.conf作为配置文件。如果Logrotate执行异常退出,脚本会使用系统日志记录一条警告消息。
然而,在某些情况下,每天执行一次可能不够频繁。例如,对于高流量的Web服务器,可能需要更频繁地轮转日志。在这种情况下,我们可以创建一个自定义的Cron作业来更频繁地运行Logrotate。
要创建自定义的Cron作业,我们可以编辑系统的Crontab文件。使用以下命令编辑系统级的Crontab:
sudo crontab -e
然后,我们可以添加一个新的条目来更频繁地运行Logrotate。例如,要每小时运行一次Logrotate,可以添加以下行:
0 * * * * /usr/sbin/logrotate /etc/logrotate.conf
这个配置会在每小时的整点运行Logrotate。
如果我们只想对特定的日志文件进行更频繁的轮转,而不影响其他日志文件,可以创建一个单独的Logrotate配置文件,并在Cron作业中指定这个配置文件。例如,创建一个名为/etc/logrotate-
hourly.conf
的文件,其中包含需要每小时轮转的日志文件的配置,然后在Crontab中添加以下行:
0 * * * * /usr/sbin/logrotate /etc/logrotate-hourly.conf
这样,我们就可以实现对不同日志文件采用不同的轮转频率。
注意:过于频繁地运行Logrotate可能会对系统性能产生影响,特别是在处理大量或大型日志文件时。因此,在设置Cron作业时,应该仔细考虑系统的负载情况和日志生成的速度,找到一个合适的平衡点。
如果我们使用了Logrotate的"size"选项来基于文件大小进行轮转,那么可能需要更频繁地运行Logrotate以确保及时捕获到达大小阈值的日志文件。在这种情况下,可以考虑每5分钟或每10分钟运行一次Logrotate。
一些现代的Linux发行版使用systemd定时器而不是传统的Cron来调度Logrotate。在这些系统中,我们可以通过编辑systemd定时器单元文件来调整Logrotate的运行频率。无论使用哪种方法,关键是要确保Logrotate能够按照我们的需求定期运行,从而有效地管理系统的日志文件。
6.2 与日志分析工具的集成
Logrotate作为一个强大的日志管理工具,不仅可以有效地控制日志文件的大小和数量,还可以与各种日志分析工具无缝集成,从而提供更全面的日志管理解决方案。这种集成可以帮助系统管理员更有效地监控系统状态、排查问题并进行安全审计。
6.2.1 与ELK Stack的集成
ELK Stack(Elasticsearch、Logstash、Kibana)是一个广泛使用的开源日志分析平台。Logrotate可以与ELK Stack完美配合,实现日志的高效管理和分析。
在Logrotate配置中,我们可以添加一个postrotate
脚本,在日志轮转后立即触发Logstash的处理。例如:
# /etc/logrotate.d/myapp # 这是用于管理myapp日志文件的Logrotate配置文件 # 匹配/var/log目录下的myapp.log文件 /var/log/myapp.log { # 每天轮转一次日志 daily # 保留7个轮转后的日志文件 rotate 7 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 创建新的日志文件,设置权限为0644,所有者为root,组为root create 0644 root root # 在日志轮转结束后执行的脚本 postrotate # 重启logstash服务,确保其能够处理新的日志文件 /usr/bin/systemctl restart logstash # 脚本结束 endscript }
在这个配置中,每次日志轮转后,Logstash服务会被重启,确保它能够处理新的日志文件。
此外,我们还可以配置Logstash以监视Logrotate创建的压缩日志文件。在Logstash的配置文件中,可以这样设置:
input { file { # 指定要监控的日志文件路径,可以使用通配符匹配多个文件 path => "/var/log/myapp.log*" # 指定从文件的开头开始读取日志 start_position => "beginning" # 指定sincedb文件的路径,用于记录文件读取的进度 # 这里设置为/dev/null,表示不保存进度,每次启动都重新读取 sincedb_path => "/dev/null" # 忽略旧的日志文件,0表示不忽略任何文件 ignore_older => 0 # 指定日志文件的编码格式,这里设置为json codec => "json" } }
这个配置让Logstash监视所有的myapp.log
文件,包括Logrotate创建的轮转和压缩后的日志文件。
6.2.2 与Graylog的集成
Graylog是另一个流行的日志管理和分析平台。Logrotate可以与Graylog协同工作,确保日志数据能够持续不断地流入Graylog系统。
我们可以在Logrotate配置中添加一个postrotate
脚本,在日志轮转后通知Graylog:
# /etc/logrotate.d/syslog # 这是用于管理系统日志文件的Logrotate配置文件 # 匹配/var/log/syslog文件 /var/log/syslog { # 每天轮转一次日志 daily # 保留7个轮转后的日志文件 rotate 7 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 在日志轮转结束后执行的脚本 postrotate # 发送HTTP POST请求到Graylog服务器,重启指定的输入 curl -XPOST http://graylog-server:12201/api/system/inputs/5e2f5d80e39700e6a8d4d8d9/restart # 脚本结束 endscript }
在这个例子中,我们使用curl命令向Graylog服务器发送一个API请求,重启指定的输入。这确保了Graylog能够正确处理新的日志文件。
6.2.3 与Splunk的集成
Splunk是一个强大的商业日志分析平台。Logrotate可以与Splunk的通用转发器(Universal Forwarder)配合使用,确保日志数据能够持续不断地流入Splunk索引器。
在Logrotate配置中,我们可以添加一个postrotate
脚本来重新加载Splunk转发器:
# /etc/logrotate.d/app # 这是用于管理应用程序日志文件的Logrotate配置文件 # 匹配/var/log/app/目录下所有以.log结尾的文件 /var/log/app/*.log { # 每天轮转一次日志 daily # 保留30个轮转后的日志文件 rotate 30 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 创建新的日志文件,设置权限为0644,所有者和组为splunk create 0644 splunk splunk # 在日志轮转结束后执行的脚本 postrotate # 重启Splunk Universal Forwarder以确保它能够处理新的日志文件 /opt/splunkforwarder/bin/splunk restart # 脚本结束 endscript }
这个配置在每次日志轮转后重启Splunk转发器,确保它能够正确处理新的日志文件。
6.2.4 与自定义日志分析脚本的集成
对于一些特定的日志分析需求,我们可能需要使用自定义的分析脚本。Logrotate可以很容易地与这些脚本集成。
例如,假设我们有一个名为analyze_logs.py
的Python脚本,用于分析日志并生成报告。我们可以在Logrotate配置中这样使用它:
# /etc/logrotate.d/custom_app # 这是用于管理自定义应用程序日志文件的Logrotate配置文件 # 匹配/var/log/目录下的custom_app.log文件 /var/log/custom_app.log { # 每天轮转一次日志 daily # 保留7个轮转后的日志文件 rotate 7 # 压缩轮转后的日志文件 compress # 延迟压缩最新的一个轮转日志文件到下一次轮转 delaycompress # 如果日志文件不存在,不报错继续执行 missingok # 如果日志文件为空,则不轮转 notifempty # 在日志轮转结束后执行的脚本 postrotate # 执行自定义的Python脚本来分析最近轮转的日志文件 /usr/bin/python3 /path/to/analyze_logs.py /var/log/custom_app.log.1 # 脚本结束 endscript }
在这个配置中,每次日志轮转后,我们的Python脚本都会被执行,分析最近一天的日志文件(custom_app.log.1
)。
通过这种方式,Logrotate不仅管理了日志文件的大小和数量,还触发了日志分析过程,使得日志管理和分析成为一个连贯的工作流程。
7. 总结
F. 附录
F.1 Logrotate命令行参数参考
Logrotate提供了多种命令行参数,使用户能够灵活地控制日志轮转过程。接下来是Logrotate命令行参数的详细说明。
-f,–force
强制执行日志轮转,即使Logrotate认为没有必要。这个选项在测试配置或手动触发日志轮转时非常有用。例如:
logrotate -f /etc/logrotate.conf
这个命令将强制执行所有配置的日志轮转。
-v,–verbose
启用详细模式,Logrotate将输出更多的信息,包括它正在执行的操作。这对于调试配置问题或了解Logrotate的工作过程很有帮助。
-d,–debug
启用调试模式。在这种模式下,Logrotate不会实际执行任何操作,而是显示它将要执行的操作。这对于测试新的配置非常有用,可以帮助我们在不影响实际日志文件的情况下验证配置是否正确。
-s,–state
使用指定的状态文件而不是默认的/var/lib/logrotate/status
。状态文件记录了每个日志文件上次轮转的时间,Logrotate使用这些信息来决定是否需要进行轮转。例如:
logrotate -s /path/to/custom/statefile /etc/logrotate.conf
-m,–mail
指定用于发送邮件的命令。默认情况下,Logrotate使用/bin/mail
。如果我们的系统使用不同的邮件命令,可以使用这个选项指定。例如:
logrotate -m /usr/bin/sendmail /etc/logrotate.conf
–usage
显示简短的用法信息。
-?,–help
显示帮助信息,包括所有可用的命令行选项。
–version
显示Logrotate的版本信息。
-l,–log
指定Logrotate的日志文件。Logrotate会将其操作记录到这个文件中,这对于监控和调试非常有用。例如:
logrotate -l /var/log/logrotate.log /etc/logrotate.conf
-c,–create-config
创建一个新的配置文件。这个选项会生成一个包含默认设置的配置文件模板。
-t,–test
测试模式。类似于调试模式,但会进行更详细的检查。它会解析配置文件并显示将要执行的操作,但不会实际修改任何文件。例如:
logrotate -t /etc/logrotate.conf
-w,–wait
等待模式。如果另一个Logrotate进程正在运行,这个选项会使当前进程等待,直到其他进程完成。这可以防止多个Logrotate进程同时运行导致的潜在问题。
这些命令行参数为系统管理员提供了极大的灵活性,使他们能够根据具体需求精细控制Logrotate的行为。在日常管理中,最常用的可能是"-f"(强制轮转)、“-v”(详细模式)和"-d"(调试模式)这几个选项。“-s"选项在使用非标准状态文件位置时很有用,而”-t"选项则是在应用新配置之前进行测试的好工具。
F.2 配置文件模板
以下是Logrotate配置文件的模板示例,包含了常用的选项和说明:
# 全局选项 # 以下选项将应用于所有日志文件,除非在特定日志文件的配置中被覆盖 # 轮转频率:可选daily、weekly、monthly、yearly daily # 保留的旧日志文件数量 rotate 7 # 创建新的空日志文件,并设置模式、所有者和组 create 0644 root root # 压缩旧的日志文件 compress # 延迟压缩最近的一个日志文件 delaycompress # 如果日志文件不存在,不报错 missingok # 不轮转空的日志文件 notifempty # 使用日期作为轮转后的文件扩展名 dateext # 包含/etc/logrotate.d目录下的配置文件 include /etc/logrotate.d # 特定日志文件的配置 /var/log/syslog { # 覆盖全局选项 rotate 14 daily compress delaycompress postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } # 使用通配符匹配多个日志文件 /var/log/mail.log /var/log/debug /var/log/messages { weekly rotate 4 missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } # 基于大小的轮转示例 /var/log/large_application.log { size 100M rotate 5 compress delaycompress missingok notifempty create 0644 root root } # 使用dateformat选项自定义日期格式 /var/log/custom_date_application.log { daily rotate 30 compress dateext dateformat -%Y%m%d-%s missingok notifempty create 0644 root root } # 使用prerotate和postrotate脚本的示例 /var/log/apache2/*.log { weekly rotate 52 compress delaycompress missingok notifempty create 0640 root adm sharedscripts prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi endscript postrotate /etc/init.d/apache2 reload > /dev/null endscript } # 使用su选项更改用户和组 /var/log/mysql/*.log { weekly rotate 12 compress delaycompress missingok notifempty create 0640 mysql adm su mysql adm postrotate /usr/bin/mysqladmin flush-logs endscript } # 使用copytruncate选项的示例 /var/log/application_without_logrotate_support.log { daily rotate 7 compress missingok notifempty copytruncate } # 使用maxsize选项的示例 /var/log/large_and_frequent.log { daily rotate 30 compress delaycompress missingok notifempty create 0644 root root maxsize 100M } # 使用maxage选项的示例 /var/log/long_term_storage.log { monthly rotate 60 compress missingok notifempty create 0644 root root maxage 730 }
这个模板涵盖了Logrotate的许多常用选项和场景。它包括全局设置、特定日志文件的配置、使用通配符匹配多个日志文件、基于大小的轮转、自定义日期格式、使用预轮转和后轮转脚本、更改用户和组、使用copytruncate选项、maxsize选项和maxage选项等。
在实际使用时,您可以根据具体需求修改这个模板。例如,您可能需要调整轮转频率、保留的日志文件数量、压缩选项等。对于特定的应用程序,您可能还需要添加特定的预轮转或后轮转脚本。
请记住,Logrotate配置文件的语法非常灵活。您可以在全局级别设置选项,然后在特定日志文件的配置中覆盖这些选项。此外,您还可以使用条件语句来根据特定条件应用不同的设置。
最后,建议在应用新的配置之前,使用Logrotate的"-d"(调试)选项来测试配置,确保一切按预期工作。例如:
logrotate -d /etc/logrotate.conf
这将显示Logrotate将要执行的操作,而不会实际修改任何文件,让您可以安全地验证配置是否正确。
F.3 更多示例
在Logrotate的配置中,正则表达式是一个强大的工具,可以帮助我们更灵活地匹配和管理日志文件。接下来是一些常用的正则表达式示例,这些示例可以帮助系统管理员更有效地配置。Logrotate。
匹配特定扩展名的文件:
如果我们想要匹配所有以".log"结尾的文件,可以使用以下正则表达式:
/var/log/*.log { # 配置选项 }
这个表达式会匹配/var/log
目录下所有以".log"结尾的文件。
匹配多个扩展名:
如果我们需要同时匹配多个扩展名,例如".log"和".txt",可以使用以下正则表达式:
/var/log/*.(log|txt) { # 配置选项 }
这个表达式会匹配/var/log
目录下所有以".log"或".txt"结尾的文件。
匹配特定前缀的文件:
如果我们想要匹配所有以"app_"开头的日志文件,可以使用以下正则表达式:
/var/log/app_*.log { # 配置选项 }
这个表达式会匹配/var/log
目录下所有以"app_“开头、”.log"结尾的文件。
匹配包含特定字符串的文件:
如果我们想要匹配文件名中包含"error"的所有日志文件,可以使用以下正则表达式:
/var/log/*error*.log { # 配置选项 }
这个表达式会匹配/var/log
目录下文件名中包含"error"并以".log"结尾的所有文件。
匹配多级目录下的文件:
如果我们需要匹配/var/log
及其所有子目录下的日志文件,可以使用以下正则表达式:
/var/log/**/*.log { # 配置选项 }
这个表达式会递归地匹配/var/log
及其所有子目录下以".log"结尾的文件。
匹配特定日期格式的文件:
如果日志文件名中包含日期,例如"app-2023-05-15.log",我们可以使用以下正则表达式来匹配它们:
/var/log/app-[0-9]{4}-[0-9]{2}-[0-9]{2}.log { # 配置选项 }
这个配置会对大于1MB的日志文件进行轮转。
匹配除特定文件外的所有文件:
如果我们想要匹配除了某个特定文件之外的所有日志文件,可以使用否定模式:
/var/log/!(special_file).log { # 配置选项 }
这个表达式会匹配/var/log目录下除"special_file.log"之外的所有".log"文件。
这些正则表达式示例涵盖了许多常见的日志文件匹配场景。在实际应用中,系统管理员可以根据具体需求组合或修改这些表达式。需要注意的是,Logrotate使用的是扩展的GNU正则表达式语法,这为我们提供了强大而灵活的匹配能力。
在使用这些正则表达式时,建议先使用Logrotate的调试模式(-d选项)来测试配置,确保表达式正确匹配了预期的文件。这可以帮助我们避免因配置错误而导致的日志管理问题。
正则表达式是一个强大的工具,但也需要谨慎使用。过于复杂的表达式可能会影响Logrotate的性能,特别是在处理大量日志文件时。因此,在设计正则表达式时,应该尽量保持简洁明了,同时确保它们能够准确地匹配目标文件。