【问题标题】:log4net: How to set logger file name dynamically?log4net:如何动态设置记录器文件名?
【发布时间】: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 你能详细说明一下吗?我正在尝试做类似的事情,但觉得可能有更好的选择,但我对任何一个都不知道。您的评论似乎表明这是解决此问题的错误策略。我知道这是一个旧评论,我很感激任何回应。

标签: dynamic log4net filenames


【解决方案1】:

如何使用“%property”为文件名定义一个动态“标签”(在运行时)?

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

在此解释:Best way to dynamically set an appender file path

【讨论】:

    【解决方案2】:

    你可以使用这个功能: 在此函数中,首先获取您在 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

    【讨论】:

    • 请不要对多个问题发布完全相同的答案 - 它们要么不适合,要么问题是重复的,应该这样标记
    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2010-09-14
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多