Logger 如何按天归档
下面以常见语言和日志框架为例,说明 Logger 如何按天归档(Daily Rolling / Log Rotation)。核心思路都是:文件名带日期 + 定期切换日志文件。
一、通用原理(重要)
按天归档通常包含 3 个要素:
-
日志文件名包含日期
app-2026-01-21.log app-2026-01-22.log -
时间触发切换
- 按天(daily)
- 或按文件大小 + 日期组合
-
可选:历史日志清理
- 保留最近 N 天
- 或按文件数量限制
二、Java(最常见)
✅ Logback(强烈推荐)
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>30maxHistory>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%npattern>
encoder>
appender>
<root level="INFO">
<appender-ref ref="FILE"/>
root>
configuration>
✅ 特点:
- 自动按天生成新文件
- 无需额外代码
- 生产环境首选
✅ Log4j2
<RollingFile name="FileAppender"
fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}.log">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%nPattern>
PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
Policies>
<DefaultRolloverStrategy max="30"/>
RollingFile>
三、Python
✅ logging + TimedRotatingFileHandler
import logging
from logging.handlers import TimedRotatingFileHandler
handler = TimedRotatingFileHandler(
filename="app.log",
when="midnight", # 按天
interval=1,
backupCount=30,
encoding="utf-8"
)
handler.suffix = "%Y-%m-%d"
logging.basicConfig(
level=logging.INFO,
handlers=[handler]
)
生成文件:
app.log
app.log.2026-01-21
app.log.2026-01-22
✅ when="midnight" 表示 每天 0 点归档
四、Node.js
✅ winston + winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '30d'
});
const logger = winston.createLogger({
transports: [transport]
});
五、Linux 系统级(通用)
即使不用框架,也可以用 logrotate(生产环境非常常见):
/var/log/app/*.log {
daily
rotate 30
compress
missingok
notifempty
copytruncate
}
✅ 适合:
- 所有语言
- 容器外运行的服务
六、最佳实践建议
✅ 生产环境推荐组合
- Java → Logback
- Python → TimedRotatingFileHandler
- Node.js → winston-daily-rotate-file
- 服务级 → logrotate
✅ 避免
- 单个日志文件无限增长
- 手动切日志
- 日志目录无清理策略
如果你能告诉我:
- 使用的 语言 / 框架
- 是否 容器(Docker)
- 是否需要 压缩 / 保留天数
我可以直接给你一份 可复制粘贴的最终配置 ✅