我希望能够调用像我的“log.txt”复制到“log.txt.1”的“ResetLog”之类的方法,而不是在日期/时间或指定的最大大小之后滚动日志,然后清除log.txt中。
我试图通过使用FileAppender而不是RollingFileAppender执行此类操作来实现它:
var appenders = log4net.LogManager.GetRepository().GetAppenders();
foreach (var appender in appenders) {
var fa = appender as log4net.Appender.FileAppender;
if (fa != null) {
string logfile = fa.File;
fa.Close();
string new_file_path = CreateNextLogFile(logfile);
fa.File = new_file_path;
fa.ActivateOptions();
}
}
文件已关闭,CreateNextLogFile()将其重命名。然后,我创建一个新的日志文件并设置FileAppender以使用它。但是,我认为ActivateOptions将继续并使用所需的设置重新配置FileAppender。我查看了log4net文档,并没有看到任何其他允许我在关闭后重新打开FileAppender的公共方法。任何人都可以推荐一种实现翻转的方法吗?如果RollingFileAppender有这样的东西会很好,但我也没有看到它的文档有用。
答案 0 :(得分:3)
如果我们查看RollingFileAppender
,我们可以看到翻转机制包括关闭文件,重命名现有文件(可选)并再次打开它:
// log4net.Appender.RollingFileAppender
protected void RollOverSize()
{
base.CloseFile();
// debug info removed
this.RollOverRenameFiles(this.File);
if (!this.m_staticLogFileName && this.m_countDirection >= 0)
{
this.m_curSizeRollBackups++;
}
this.SafeOpenFile(this.m_baseFileName, false);
}
不幸的是,CloseFile
/ SafeOpenFile
方法受到保护,这意味着您无法从外部访问它(不容易)。因此,最好的办法是编写一个继承自RollingFileAppender
的appender,并覆盖在将任何日志记录事件添加到appender之前调用的虚拟AdjustFileBeforeAppend
。
如果必须发生,您可以决定掷骰的条件。一个想法是创建一个静态事件,您的自定义滚动appender会怀疑:当事件被触发时,appender会记录它(rollBeforeNextAppend = true;
)。一旦你尝试并记录下一个条目,appender就会滚动。
public class CustomRollingAppender: RollingFileAppender
{
public CustomRollingAppender()
{
MyStaticCommandCenter.RollEvent += Roll;
}
public void Roll()
{
rollBeforeNextAppend = true;
}
public bool rollBeforeNextAppend {get; set;}
public override void AdjustFileBeforeAppend()
{
if (rollBeforeNextAppend) {
CloseFile();
RollOverRenameFiles(File);
SafeOpenFile(Filename, false);
rollBeforeNextAppend = false;
}
}
}