脚本中Logrotate日志轮转如何配

wen 实用脚本 3

本文目录导读:

脚本中Logrotate日志轮转如何配

  1. 方式一:通过脚本生成 Logrotate 配置文件
  2. 方式二:在脚本中直接调用 logrotate
  3. 常用 Logrotate 配置模板
  4. 集成到 Ansible/Puppet/Salt 脚本
  5. 验证配置是否生效

在自动化脚本或配置管理(如 Ansible、Shell 脚本)中配置 Logrotate,通常有两种方式:

直接生成配置文件(推荐)
在脚本中调用 logrotate 命令

下面分别介绍这两种方式,并给出常见的配置模板。


通过脚本生成 Logrotate 配置文件

这是最规范的做法,Logrotate 的配置放在 /etc/logrotate.d/ 目录下,每个应用或服务一个配置文件。

Shell 脚本示例

假设你有一个应用日志路径为 /var/log/myapp/*.log,需要按天轮转,保留 7 天,并压缩。

#!/bin/bash
# 日志轮转配置文件路径
CONFIG_FILE="/etc/logrotate.d/myapp"
# 写入配置
cat > $CONFIG_FILE << 'EOF'
/var/log/myapp/*.log {
    daily              # 每天轮转一次
    missingok          # 如果日志不存在不报错
    rotate 7           # 保留 7 个旧日志
    compress           # 压缩旧日志(默认 gzip)
    delaycompress      # 延迟压缩,最近一个轮转的不压,方便查看
    notifempty         # 日志为空则不轮转
    create 0640 www-data adm  # 创建新日志文件的权限、用户、组
    sharedscripts      # 多个日志文件匹配时,只执行一次 postrotate
    postrotate
        # 通知应用重新打开日志文件(以 Nginx 为例)
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}
EOF
echo "Logrotate 配置已生成: $CONFIG_FILE"

关键点说明:

  • daily/weekly/monthly:轮转频率
  • rotate N:保留旧日志个数
  • compress / delaycompress:压缩设置
  • create 权限 用户 组:轮转后新日志的文件权限
  • postrotate ... endscript:轮转后执行的命令(如重载应用)
  • sharedscripts:多个日志匹配时,postrotate 只执行一次

在脚本中直接调用 logrotate

如果你不想生成配置文件,或者需要临时强制轮转,可以在脚本中使用 logrotate 命令。

#!/bin/bash
LOG_FILE="/var/log/myapp/access.log"
CONFIG_CONTENT=$(cat << 'EOF'
/var/log/myapp/access.log {
    daily
    rotate 3
    compress
    postrotate
        # 某些应用需要信号来重新打开日志
        systemctl reload nginx 2>/dev/null || true
    endscript
}
EOF
)
# 方式 A: 使用临时文件
echo "$CONFIG_CONTENT" > /tmp/myapp_logrotate.conf
logrotate -f /tmp/myapp_logrotate.conf   # -f 强制轮转
rm /tmp/myapp_logrotate.conf
# 方式 B: 使用管道(部分系统不支持)
# echo "$CONFIG_CONTENT" | logrotate -f -

注意:

  • -f:强制执行轮转(即使不满足条件也轮转)
  • -v:详细输出,方便调试
  • -s:指定状态文件(默认 /var/lib/logrotate/logrotate.status

常用 Logrotate 配置模板

通用应用日志(如 Java/Python 应用)

/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    dateext           # 日志文件名带日期
    missingok
    notifempty
    create 0640 appuser appgroup
    sharedscripts
    postrotate
        # 根据应用实际重载机制调整
        supervisorctl signal HUP myapp 2>/dev/null || true
    endscript
}

Nginx 日志

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Docker 容器日志

/var/lib/docker/containers/*/*.log {
    rotate 3
    daily
    compress
    missingok
    delaycompress
    copytruncate    # 拷贝并截断原日志,无需信号通知
    notifempty
}

注意: copytruncate 可能会丢失少量日志行,但对 Docker 这种无法发送重载信号的场景很有效。


集成到 Ansible/Puppet/Salt 脚本

Ansible 示例

- name: 配置 logrotate for myapp
  ansible.builtin.copy:
    dest: /etc/logrotate.d/myapp
    content: |
      /var/log/myapp/*.log {
          daily
          rotate 7
          compress
          delaycompress
          missingok
          notifempty
          create 0640 www-data adm
          postrotate
              systemctl reload nginx || true
          endscript
      }
    owner: root
    group: root
    mode: '0644'

验证配置是否生效

# 测试配置文件语法(不会实际轮转)
logrotate -d /etc/logrotate.d/myapp
# 强制运行一次轮转
logrotate -f /etc/logrotate.d/myapp
# 查看当前状态
cat /var/lib/logrotate/logrotate.status | grep myapp

场景 推荐做法
新部署应用时 在安装脚本中生成 /etc/logrotate.d/ 配置文件
需要临时轮转 使用 logrotate -f 命令
配置管理工具 使用模板模块(Ansible copy/template
Docker 容器日志 使用 copytruncate 模式

关键点

  • 配置文件放在 /etc/logrotate.d/,系统 cron 会自动执行。
  • 主配置文件 /etc/logrotate.confinclude /etc/logrotate.d 确保子配置生效。
  • postrotate 中必须发送正确的信号或命令通知应用重载日志文件。

抱歉,评论功能暂时关闭!