我今天开始使用log4net,到目前为止,我非常喜欢它。为了保留我们当前的日志记录功能,应用程序需要在应用程序启动时创建新的日志文件。日志文件名具有编码在其中的日期和时间戳。目前,我已经通过XmlConfigurator
配置了log4net,除了我的RollingFileAppender
的文件名在配置XML文件中进行了硬编码外,效果很好。
我想继续使用XmlConfigurator
,但在调用Configure()
之后,我希望得到RollingFileAppender
,并在代码中将其文件值更改为动态生成的字符串。示例documentation online现在似乎已经关闭,但我已经浏览了SDK参考,看起来我可以使用Heirarchy
和GetAppenders()
来做我需要做的事情。我是在正确的轨道上吗?
好的,我对此进行了尝试并尝试了以下代码,但这些代码无效:
private static readonly ILog _log = LogManager.GetLogger(typeof(GUI));
// in the config file, I've set the filename to example.log, and it works
XmlConfigurator.Configure(new FileInfo("log_config.xml"));
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if(hierarchy != null) {
// get the appenders
IAppender[] appenders = hierarchy.GetAppenders();
// change the filename for the RollingFileAppender
foreach( IAppender a in appenders) {
RollingFileAppender rfa = a as RollingFileAppender;
if(rfa == null)
continue;
rfa.File = "newfile.log"; // no runtime error, but doesn't work.
}
}
_log.Info("Application started");
答案 0 :(得分:8)
试试这个代码段:
XmlConfigurator.Configure();
log4net.Repository.ILoggerRepository repo = LogManager.GetRepository();
foreach (log4net.Appender.IAppender appender in repo.GetAppenders())
{
if (appender.Name.CompareTo("RollingFileAppender") == 0 && appender is log4net.Appender.RollingFileAppender)
{
var appndr = appender as log4net.Appender.RollingFileAppender;
string logPath = "MyApplication.log";
appndr.File = logPath;
appndr.ActivateOptions();
}
我发布了类似的文章here
答案 1 :(得分:2)
在这种情况下你需要滚动文件appender吗?如果不是,如果您使用普通的文件追加器,我会期望您的代码会创建所需的结果。
编辑:如果你在appender上调用ActivateOptions()
,也许它适用于RollingFile Appender。