意图:
a)我希望我的日志按照以下文件格式yyyy-MM-dd.txt按日期滚动.
b)除此之外,我想删除超出maxSizeRollBackups范围的旧文件.
Run Code Online (Sandbox Code Playgroud)CAUTION A maximum number of backup files when rolling on date/time boundaries is not supported. [RollingFileAppender spec][1]
解
对于a)足以进行配置
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="30" />
<datePattern value="yyyy-MM-dd'.txt'" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.XmlLayoutSchemaLog4j"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
Run Code Online (Sandbox Code Playgroud)
for b)RollingFileAppender +删除东西的继承是实现这个目的的唯一方法吗?
几个月前我花了一些时间研究这个问题.v1.2.10不支持基于按日期滚动删除较旧的日志文件.它位于下一版本的任务列表中.我自己获取了源代码并添加了功能,如果他们感兴趣,可以将其发布给其他人.问题和补丁可以在https://issues.apache.org/jira/browse/LOG4NET-27找到.
考虑到十多年过去了,它仍然不受支持,我选择了以下覆盖RollingFileAppender所需功能的解决方案:
public class RollingDateAppender : RollingFileAppender {
public TimeSpan MaxAgeRollBackups { get; set; }
public RollingDateAppender()
: base() {
PreserveLogFileNameExtension = true;
StaticLogFileName = false;
}
protected override void AdjustFileBeforeAppend() {
base.AdjustFileBeforeAppend();
string LogFolder = Path.GetDirectoryName(File);
var CheckTime = DateTime.Now.Subtract(MaxAgeRollBackups);
foreach (string file in Directory.GetFiles(LogFolder, "*.log")) {
if (System.IO.File.GetLastWriteTime(file) < CheckTime)
DeleteFile(file);
}
}
}
Run Code Online (Sandbox Code Playgroud)
配置就像原始类一样简单:
roller = new RollingDateAppender {
AppendToFile = true,
File = ...;
MaxAgeRollBackups = TimeSpan.FromDays(7),
RollingStyle = RollingFileAppender.RollingMode.Date,
...
};
roller.ActivateOptions();
BasicConfigurator.Configure(roller);
Run Code Online (Sandbox Code Playgroud)
请注意,*.log在日志目录中查找文件仅PreserveLogFileNameExtension在使用 或DatePattern用于在文件名末尾包含扩展名时才有意义。如果您需要不同的命名方案,请同步修改它们。
(我使用的是 log4net 的 2.0.8 版本,早期版本可能不允许覆盖必要的功能。)
| 归档时间: |
|
| 查看次数: |
24544 次 |
| 最近记录: |