本文目录导读:

- Linux 系统 - logrotate(最常用)
- Python 应用 - logging.handlers
- Java (Logback) - logback.xml
- Node.js (winston)
- Docker 容器日志配置
- Shell 脚本自定义实现
- 建议的最佳实践
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周
- 调试日志:按需配置,及时清理
关键注意点
- 日志量评估:根据日志生成速度调整策略
- 磁盘空间:设置合理的保留周期和压缩
- 性能影响:避免频繁轮转影响业务
- 监控告警:设置磁盘空间使用率告警
实用命令
# 查看日志文件大小 du -sh /var/log/*.log # 查看日志保留时间 stat /var/log/*.log # 手动触发logrotate logrotate -f /etc/logrotate.d/app
选择合适的日志切割策略需要根据你的具体场景(日志量、磁盘空间、保留需求等)来定制,起点建议使用 logrotate,它是 Linux 系统中最成熟、最简单的方案。