Linux日志管理工具:Logrotate(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Linux日志管理工具:Logrotate(二)

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的一个强大特性是允许在轮转过程的不同阶段执行自定义脚本。这为日志管理提供了极大的灵活性。

主要有两种类型的脚本:prerotatepostrotateprerotate脚本在日志轮转之前执行,而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发行版中,LogrotateCron作业已经预先配置好了。通常,这个作业被设置为每天运行一次。你可以在/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.pyPython脚本,用于分析日志并生成报告。我们可以在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的性能,特别是在处理大量日志文件时。因此,在设计正则表达式时,应该尽量保持简洁明了,同时确保它们能够准确地匹配目标文件。  

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
14天前
|
监控 Linux 开发者
如何在 Linux 中优雅的使用 head 命令,用来看日志简直溜的不行
`head` 命令是 Linux 系统中一个非常实用的工具,用于快速查看文件的开头部分内容。本文介绍了 `head` 命令的基本用法、高级用法、实际应用案例及注意事项,帮助用户高效处理文件和日志,提升工作效率。
25 7
|
22天前
|
运维 Prometheus 监控
特定用途的日志分析工具
【10月更文挑战第20天】
43 5
|
22天前
|
存储 机器学习/深度学习 传感器
商业日志分析工具
【10月更文挑战第20天】
43 5
|
22天前
|
存储 运维 监控
开源日志分析工具
【10月更文挑战第20天】
43 3
|
1月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
46 3
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
39 1
|
1月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
57 0
|
1月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
40 0
|
3月前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
3月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
下一篇
无影云桌面