脚本如何设置日志切割策略

wen 实用脚本 25

本文目录导读:

脚本如何设置日志切割策略

  1. Linux 系统 - logrotate(最常用)
  2. Python 应用 - logging.handlers
  3. Java (Logback) - logback.xml
  4. Node.js (winston)
  5. Docker 容器日志配置
  6. Shell 脚本自定义实现
  7. 建议的最佳实践

Linux 系统 - logrotate(最常用)

配置文件位置

  • 主配置:/etc/logrotate.conf
  • 自定义配置:/etc/logrotate.d/ 目录下

示例配置

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    # 每天轮转
    daily
    # 保留7天的日志
    rotate 7
    # 日志文件最大100M
    size 100M
    # 如果日志为空,不轮转
    notifempty
    # 缺失日志文件不报错
    missingok
    # 压缩旧日志
    compress
    # 延迟压缩
    delaycompress
    # 轮转后执行脚本
    postrotate
        systemctl reload myapp 2>/dev/null || true
    endscript
}

手动测试运行

# 测试配置是否正确
logrotate -d /etc/logrotate.d/myapp
# 强制执行
logrotate -f /etc/logrotate.d/myapp
# 查看状态
cat /var/lib/logrotate/status

Python 应用 - logging.handlers

import logging
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
# 按文件大小切分
handler = RotatingFileHandler(
    'app.log',           # 日志文件
    maxBytes=10*1024*1024,  # 10MB
    backupCount=5        # 保留5个备份
)
# 按时间切分
handler = TimedRotatingFileHandler(
    'app.log',
    when='midnight',     # 每天午夜轮转
    interval=1,
    backupCount=30
)
# 配置日志器
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

Java (Logback) - logback.xml

<configuration>
    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <!-- 按时间轮转 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/app-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 按文件大小轮转 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>100MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
</configuration>

Node.js (winston)

const winston = require('winston');
require('winston-daily-rotate-file');
const logger = winston.createLogger({
    transports: [
        new winston.transports.DailyRotateFile({
            filename: 'logs/app-%DATE%.log',
            datePattern: 'YYYY-MM-DD',
            maxSize: '20m',          // 最大20MB
            maxFiles: '14d',         // 保留14天
            zippedArchive: true      // 压缩归档
        })
    ]
});

Docker 容器日志配置

# docker-compose.yml
version: '3.8'
services:
  myapp:
    image: myapp:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"    # 每个日志文件最大10MB
        max-file: "5"      # 最多保留5个文件
        compress: "true"   # 压缩归档

Shell 脚本自定义实现

#!/bin/bash
LOG_FILE="/var/log/myapp/app.log"
LOG_DIR="/var/log/myapp"
MAX_SIZE=10485760  # 10MB in bytes
RETENTION_DAYS=7
rotate_log() {
    local current_size=$(stat -f%z "$LOG_FILE" 2>/dev/null || echo 0)
    if [ $current_size -gt $MAX_SIZE ]; then
        local timestamp=$(date +%Y%m%d_%H%M%S)
        mv "$LOG_FILE" "${LOG_FILE}_${timestamp}"
        gzip "${LOG_FILE}_${timestamp}"
        touch "$LOG_FILE"
        # 清理过期日志
        find "$LOG_DIR" -name "*.gz" -mtime +$RETENTION_DAYS -delete
    fi
}
# 设置cron定时任务(每1小时检查一次)
# crontab -e 添加: 0 * * * * /path/to/rotate.sh

建议的最佳实践

配置策略建议

  • Web应用日志:每天轮转,保留30天
  • 数据库日志:根据大小(如500M)轮转,保留7个
  • 系统日志:每周轮转,保留4周
  • 调试日志:按需配置,及时清理

关键注意点

  1. 日志量评估:根据日志生成速度调整策略
  2. 磁盘空间:设置合理的保留周期和压缩
  3. 性能影响:避免频繁轮转影响业务
  4. 监控告警:设置磁盘空间使用率告警

实用命令

# 查看日志文件大小
du -sh /var/log/*.log
# 查看日志保留时间
stat /var/log/*.log
# 手动触发logrotate
logrotate -f /etc/logrotate.d/app

选择合适的日志切割策略需要根据你的具体场景(日志量、磁盘空间、保留需求等)来定制,起点建议使用 logrotate,它是 Linux 系统中最成熟、最简单的方案。

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