logrotate 使用说明

1、logrotate 配置说明

logrotate 是 Linux 系统自带的一个日志管理工具,通过读取定义的配置文件来对指定的日志进行管理,防止日志文件过大而导致存储空间满载。

logrotate 配置文件

  • 主配置文件/etc/logrotate.conf

  • 子配置文件 /etc/logrotate.d/


子配置文件命名方式
logrotate 子配置文件在/etc/logrotate.d/目录中定义,配置文件可以任意命名,但是一般以服务名或应用名命名,这样方便识别。

例如:管理MySQL日志时,MySQL配置文件命名方式:

/etc/logrotate.d/mysql-server

日志文件默认命名规则:
日志轮换就是将当前的日志文件重命名为带编号的历史文件(如 .1.2),然后重新创建一个新的空日志文件,供服务继续写入。

例如:对/var/log/syslog进行轮换时

  • 第一次轮换:syslog → syslog.1,syslog会被重新创建
  • 第二次轮换:syslog.1 → syslog.2,syslog → syslog.1,syslog会被重新创建
  • 第三次轮换:syslog.2 → syslog.3,syslog.1 → syslog.2,syslog → syslog.1,syslog会被重新创建

2、logrotate 规则指令

轮转时间

  • daily : 表示日志文件每天都会被检查一次,如果其他要求也满足了,就会执行轮换操作。
  • weekly: 表示日志文件每周都会被检查一次,如果其他要求也满足了,就会执行轮换操作。
  • monthly : 表示每月检查一次日志文件,如果其他要求也满足了,就会执行轮换操作。
  • yearly : 表示每年检查一次日志文件,如果其他要求也满足了,就会执行轮换操作。

文件大小

  • size:指定日志文件的大小限制,如果日志文件超过了指定的大小,并且其他规则也满足了,就会执行轮换操作。

处理方式

  • rotate N:指定保留的历史日志文件数量。超过 N 个的旧日志文件将被删除。

  • compress:启用日志文件压缩。轮换后的日志文件将使用 gzip 压缩。

  • delaycompress:推迟压缩,直到下次轮换时再压缩当前日志。只有在文件第二次轮换时才会被压缩。

  • missingok:指定的日志文件路径不存在,logrotate 不会因为找不到文件而报错,会跳过当前日志文件并继续处理其它日志。

  • notifempty:日志文件 大小为 0 字节时,logrotate 会跳过这个文件,不进行轮换。

  • create mode owner group:指定轮换后新创建的日志文件的权限、所有者和用户组。

  • dateext:使用日期扩展名(如 .log-2023-01-01)来命名轮换后的日志文件。

  • olddir:指定旧日志文件存放的目录。如果未指定,默认会保留在原目录。

全局指令

以下指令只能做为全局指令。

  • su:指定轮转日志时使用哪个用户和用户组的权限,一般要和日志文件所在目录文件的所有者和所有组一致。
  • include :子配置文件的存放路径。

例如

su root adm

include /etc/logrotate.d

3、logrotate 配置格式

logrotate 配置文件一般是由两部分组成:

  • 全局配置指令:出现在配置文件的最上面,设置默认行为,对 后续所有配置块生效
  • 单个配置块:控制 特定日志文件的轮转行为,优先级高于全局设置,可以覆盖全局指令

配置文件格式

# 全局配置指令

一个或多个日志文件路径
{
	# 一个或多个轮转指令
	
	# prerotate 和 endscript部分可以省略。是满足日志轮转要求后,会在进行日轮转前执行prerotate 和 endscrip中的语句
	prerotate
		# 标准的 shell 脚本语法,默认是 /bin/sh
	endscript
	
	# postrotate 和 endscript部分可以省略。是满足日志轮转要求后,会在进行日轮转后执行 postrotate 和 endscrip中的语句
	postrotate
		# 标准的 shell 脚本语法,默认是 /bin/sh
	endscript
}

说明

  • 指定多个日志文件路径时,需要使用格分隔。

  • 指定多个日志文件路径时,支持使用通配符 * 进行多个日志文件匹配。

例如:对taos的日志进行管理

/var/log/taos/*.log {
    missingok
    compress
    rotate 3
}      

例如:配置对系统常见日志的管理规则

su root adm

/var/log/syslog
{
        rotate 7      # 保留七个切割后的日志
        daily         # 每天检查一次/var/log/syslog是否满足其他指令指定的轮换要求
        missingok     # /var/log/syslog文件路径不存在
        notifempty    #  /var/log/syslog文件大小为 0 字节时,不轮换
        delaycompress # 直到下次轮换时再压缩当前日志
        compress      # 轮换后的日志文件将使用 gzip 压缩
		
		# 如果满足日志切割要求,再进行切割前,执行以下操作
        prerotate    
            if [ -f /var/log/syslog ]; then
                size=$(stat -c %s /var/log/syslog)
                if [ "$size" -ge $((5 * 1024 * 1024 * 1024)) ]; then
                    echo "" > /var/log/syslog
                    echo "Syslog exceeded 1G and was truncated at $(date)" >> /var/log/syslog
                fi
            fi
        endscript

		# 日志切割完成后,执行以下操作,防止切割后的日志过大
        postrotate
                find /var/log -name "syslog.*" -type f -size +600M -exec rm -f {} \;
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

例如:定义MySQL日志管理规则

/var/log/mysql.log
/var/log/mysql/*log 
{
     daily
     rotate 7
     missingok
     create 640 mysql adm
     compress
     sharedscripts
     postrotate
             test -x /usr/bin/mysqladmin || exit 0
             # If this fails, check debian.conf! 
             MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
             if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
               # Really no mysqld or rather a missing debian-sys-maint user?
               # If this occurs and is not a error please report a bug.
               #if ps cax | grep -q mysqld; then
               if killall -q -s0 -umysql mysqld; then
                 exit 1
               fi
             else
               $MYADMIN flush-logs
             fi
     endscript
}

例如:apache日志管理策略

/var/log/apache2/*.log {
        daily      # 每天检查一次/var/log/apache2/下以log结尾的文件
        missingok  # 如果/var/log/apache2/下以log结尾的文件不存在,就跳过
        rotate 14  # 保留十四个转存后的日志文件
        compress   # 转存后的日志文件使用gzip压缩
        delaycompress  # 在第二次转存时才压缩第第一次转存的日志文件
        notifempty     # 如果/var/log/apache2/下以log结尾的文件大小为0,就不进行处理
        create 640 root adm  # 转存日志文件就是将现有满足条件的,以log结尾的文件使用gzip打包,
        sharedscripts        # 在轮换多个日志文件时,脚本(如 postrotate)只执行一次
        prerotate         # 在将满足条件的日志文件打包后,创建新的同名文件前执行的命令
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then
                        run-parts /etc/logrotate.d/httpd-prerotate
                fi
        endscript
        postrotate        # 在将满足条件的日志文件打包后,创建新的同名文件后执行的命令
                if pgrep -f ^/usr/sbin/apache2 > /dev/null; then
                        invoke-rc.d apache2 reload 2>&1 | logger -t apache2.logrotate
                fi
        endscript
}

4、logrotate 执行周期

默认周期:每天 0 - 12 点读取一次配置文件中的规则,然后根据规则管理日志文件。

修改周期

systemd 做为 init 初始化进行的操作系统中,是通过 systemd timer 来进行管理的。可以通过对应的 logrotate.timer 文件从而实现对执行周期的更改。logrotate.timer 默认会调用同名的 logrotate.service 服务

例如:ubuntu 2004 中的 logrotate.timer

# /lib/systemd/system/logrotate.timer
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
	# 每天触发一次
OnCalendar=daily
	# 不要求精确触发时间,允许偏差在 12 小时内,可能在 0~12 点之间的任意时刻执行(负载低的时间)
AccuracySec=12h
	# 系统在预定时间没开机(比如昨天关机),那么 下次开机时自动补跑一次任务
Persistent=true

[Install]
WantedBy=timers.target

5、logrotate 常用选项

  • -f :用于手动触发日志轮换,需要指定配置文件。

  • -d:以调试模式运行,不执行实际的轮换操作。logrotate 会显示它将如何处理每个日志文件,但不会实际轮换或修改任何文件。

  • -s:指定 logrotate 保存其状态的文件路径,记录哪些日志文件已经轮换。

  • -vlogrotate 在执行时会输出更多信息,显示每个日志文件的处理过程。

  • -l:指定 logrotate 运行时的日志文件路径,用于记录 logrotate 的执行日志。

例如:手动轮换rsyslog日志

logrotate -f /etc/logrotate.d/rsyslog

说明:如果子配置文件中,没有通过全局指令su指定轮转日志时使用哪个用户和用户组的权限,会提示

error: skipping "/var/log/..." because parent directory has insecure permissions (It's world writable or writable by group which is not "root")
Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

在这里插入图片描述

### 配置和使用Logrotate 为了在Docker环境中配置并使用`logrotate`工具,可以考虑将该工具集成到基于Linux发行版的自定义镜像中。对于CentOS环境而言,在构建阶段安装必要的软件包是一个有效的方法。 #### 创建带有Logrotate支持的基础镜像 创建一个新的`Dockerfile`文件用于描述如何组装所需的镜像: ```dockerfile FROM centos:latest RUN yum update -y && \ yum install -y logrotate cronie && \ systemctl enable crond COPY ./logrotate.conf /etc/logrotate.conf CMD ["crond", "-n"] ``` 上述脚本首先更新了系统中的现有程序包列表,并接着安装了两个主要组件——`logrotate`本身以及计划任务守护进程`cronie`[^1]。这允许定期执行日志轮转操作而无需手动干预。最后一步是从主机复制预先准备好的配置文件至容器内的标准位置。 #### 准备Logrotate配置文件 针对特定应用程序的日志管理策略应当记录在一个单独的`.conf`文档里;这里假设其位于项目根目录下名为`logrotate.conf`的位置处。下面给出了一种可能的内容结构作为例子说明: ```bash /var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 root adm } ``` 此片段指示着每天检查一次指定路径下的所有匹配模式的日志条目(`*.log`),保留最近七天的历史副本,启用压缩功能以节省磁盘空间,忽略不存在的目标文件,当发现为空时不采取任何行动,同时确保新产生的日记账簿具有恰当的所有权属性设置[^2]。 #### 测试与验证 完成以上准备工作之后,可以通过命令行界面启动新的服务实例来进行初步的功能测试: ```shell $ docker build . -t my-logrotated-app $ docker run --name=my-running-container -d my-logrotated-app ``` 此时应该已经成功部署了一个具备自动化的日志处理能力的应用服务器。要确认实际效果,则需等待一段时间让定时作业触发相应的动作,或者借助其他手段强制立即运行一轮完整的周期流程以便即时观察结果变化情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小爪子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值