【发布时间】:2015-03-07 00:12:13
【问题描述】:
这是一个非常常见的问题,但我一直无法得到工作的答案。这是我的配置文件:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="CraneUserInterface.log" />
<appendToFile value="true" />
<maxSizeRollBackups value="90" />
<rollingStyle value="Size" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFile" />
</root>
但我需要在运行时确定实际的日志记录文件名。我找到了一个很好的例子here,但是当我尝试遍历调用 GetIterators() 返回的集合时,我发现那个集合是空的。
我需要将名称“CraneUserInterface.log”更改为“CraneUserInterface_1.log”或 2 或 3,具体取决于程序在运行时读取的内容。我该怎么做?
这是我第一次使用该示例中提供的代码:
static bool ChangeLogFileName(string AppenderName, string NewFilename)
{
// log4net.Repository.ILoggerRepository RootRep;
// RootRep = log4net.LogManager.GetRepository();
log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository;
foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders())
{
string appenderName = iApp.Name;
if (iApp.Name.CompareTo(AppenderName) == 0
&& iApp is log4net.Appender.FileAppender)
{
log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp;
fApp.File = NewFilename;
fApp.ActivateOptions();
return true; // Appender found and name changed to NewFilename
}
}
return false; // appender not found
}
非常感谢!
【问题讨论】:
-
尽管阅读了两次,但我不知道您为什么要这样做。
-
这适用于一台笔记本电脑,该笔记本电脑将安装在退火工厂的起重机驾驶室中。该厂有3台起重机。由于我不在工厂,也不会在不久的将来,我有一个模拟器,它假装是所有三台起重机。该程序将同时运行 3 个实例。我需要分别跟踪 3 台起重机中的每台的事件,并且我可能应该避免该程序的两个实例同时写入同一个日志文件的任何机会。
-
那么正确的问题是什么?
-
原来问题根本不在这段代码中。问题是我对 XmlConfigurator.ConfigureAndWatch() 的调用指定了一个程序看不到的文件。一旦我发现,对 GetAppenders() 的调用返回了我期望的 appender。感谢所有花时间阅读这个问题的人。
-
@MitchWheat 你能详细说明一下吗?我正在尝试做类似的事情,但觉得可能有更好的选择,但我对任何一个都不知道。您的评论似乎表明这是解决此问题的错误策略。我知道这是一个旧评论,我很感激任何回应。