问题 log4net:如何动态设置记录器文件名?


这是一个非常常见的问题,但我无法得到工作的答案。这是我的配置文件:

<?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>

但我需要在运行时确定实际的日志文件名。我找到了一个很好的例子 这里,但是当我尝试遍历调用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
}

非常感谢!


7489
2017-07-10 00:12


起源

尽管阅读了两次,但我不知道你为什么要这样做。 - Mitch Wheat
这适用于将在退火厂的起重机驾驶室中的笔记本电脑。该工厂有3台起重机。由于我不在工厂,也不会在不久的将来,我有一个假装成三个起重机的模拟器。这个程序将有3个实例同时运行。我需要分别跟踪3台起重机中每台起重机的事件,我可能应该避免这个程序的两个实例同时写入同一个日志文件的任何可能性。 - ROBERT RICHARDSON
我认为我的直觉是正确的。你正试图解决错误的问题。 - Mitch Wheat
那么什么是正确的问题? - ROBERT RICHARDSON
事实证明问题根本不在这个代码中。问题是我对XmlConfigurator.ConfigureAndWatch()的调用指定了程序无法看到的文件。一旦我发现,对GetAppenders()的调用返回了我期望的appender。感谢所有花时间阅读这个问题的人。 - ROBERT RICHARDSON


答案:


如何使用“%property”来定义文件名的动态“标记”(在运行时)?

<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />

这里解释一下: 动态设置appender文件路径的最佳方法


8
2018-03-20 15:00





你可以使用这个功能: 在此函数中首先获取您在webconfig中设置的文件位置,然后您可以添加所需的任何路径!像约会!我们的顾客 !要么 .....

WebConfig:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\\t4\\"/>
    <appendToFile value="true"/>
    <rollingStyle value="Composite"/>
    <datePattern value="_yyyy-MM-dd.lo'g'"/>
    <maxSizeRollBackups value="10"/>
    <maximumFileSize value="1MB"/>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/>
    </layout>
</appender>

功能:

public static void ChangeFileLocation(string _CustomerName,string _Project)
{
    XmlConfigurator.Configure();
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();

    foreach (IAppender a in h.Root.Appenders)
    {
        if (a is FileAppender)
        {
            FileAppender fa = (FileAppender)a;
            string sNowDate=  DateTime.Now.ToLongDateString();
            // Programmatically set this to the desired location here
            string FileLocationinWebConfig = fa.File;
            string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log";

            fa.File = logFileLocation;
            fa.ActivateOptions();
            break;
        }
    }
}

结果如下:C:\ t4 \ TestProject \ Customer1 \ Saturday,August 31,2013.log


5
2017-09-01 09:46



请不要在多个问题上发布完全相同的答案 - 它们要么不合适,要么问题是重复的,应该标记为 - kleopatra