log4net按日期分割日志必须正确配置rollingstyle=date、datepattern(含单引号)和staticlogfilename=false;生产环境推荐composite模式,需同时设置maximumfilesize和maxsizerollbackups。

Log4Net 按日期分割日志不是靠“猜格式”或“试运行”,而是必须正确组合 RollingStyle、DatePattern 和 StaticLogFileName 三个参数——任一配置错误,都会导致日志写入失败、文件名乱码或根本不分割。
RollingStyle=Date 时,DatePattern 决定滚动频率和文件名生成逻辑
很多人以为 DatePattern 只是“美化时间显示”,其实它直接控制滚动触发时机和文件命名规则。比如:
-
DatePattern值为"yyyyMMdd'.log'"→ 每天 00:00 创建新文件,如log_20260426.log -
DatePattern值为"yyyy-MM-dd HH'.log'"→ 每小时创建一个,如log_2026-04-26 15.log - 若值中漏掉单引号(如写成
yyyyMMdd.log),log4net 会把.log当作日期格式符解析,最终生成类似log_20260426123456.log的错误文件名
StaticLogFileName=false 是按日期分割的硬性前提
当 StaticLogFileName 设为 true(默认值),log4net 会无视 DatePattern,始终往同一个文件(如 logfile.log)追加内容——无论你配了多正确的 DatePattern,都不会产生新文件。
必须显式设为 false,才能让 file 路径中的占位符(如 logs\app_{date}.log)生效。常见错误配置:
<file value="logs\app.log"></file><rollingstyle value="Date"></rollingstyle><datepattern value="yyyyMMdd'.log'"></datepattern><staticlogfilename value="true"></staticlogfilename>
这段配置实际等价于“只写 app.log”,DatePattern 完全被忽略。
Composite 模式才是生产环境真正可靠的方案
纯 Date 滚动在高并发场景下有风险:单日日志量超 1GB 时,一个大文件仍难打开、备份慢、I/O 压力集中。推荐用 RollingStyle=Composite:
- 先按日期分主文件(
app_20260426.log) - 同一天内,单文件达到
maximumFileSize(如"5MB")就自动切出app_20260426.1.log、app_20260426.2.log - 配合
maxSizeRollBackups="30",可确保最多保留 30 个归档文件(含日期+序号)
关键点:DatePattern 在 Composite 下依然生效,但 maximumFileSize 和 maxSizeRollBackups 必须同时配置,否则大小限制不触发。
初始化失败会导致日志静默丢失,必须验证 ILogger 实例是否有效
log4net 不报错也不抛异常是常态。常见静默失败原因:
-
XmlConfigurator.Configure()没在Main()或应用启动最早期调用(早于任何LogManager.GetLogger) - 配置节未在
app.config中正确定义<configsections></configsections>,导致 XML 解析跳过整个<log4net></log4net>节 - Appender 名称拼写错误(如配置里叫
"RollingFileAppender",但<root></root>里写成ref="rollingFileAppender",大小写不匹配)
最简验证法:在初始化后加一行 LogManager.GetLogger("test").Info("log4net init ok");,检查对应日志文件是否出现该行——没出现,说明初始化失败或路由规则未命中。
按日期分割本身不难,难的是让 log4net 在不同 .NET 版本、不同部署路径、不同并发压力下都稳定输出。真正容易被忽略的,是 StaticLogFileName=false 这个开关和 Composite 模式下 maxSizeRollBackups 与 maximumFileSize 的联动关系——缺一不可。










