【问题标题】:log4net configuration file changes are not reflected into loggers in class librarieslog4net 配置文件更改不会反映到类库中的记录器中
【发布时间】:2021-08-18 04:20:15
【问题描述】:

我在使用 log4net 日志库时遇到问题。

有 3 个项目。

  1. .Net Core v2.2 WebAPI(添加了 log4net 库,添加了 log4net.config)- 使用以下类库
  2. .Net Standard v2.0 类库(添加了 log4net 库)
  3. .Net Standard v2.0 类库(添加了 log4net 库)

在项目 1 中,在 Startup.cs 中使用以下代码启动 log4net:

loggerFactory.AddLog4Net("log4net.config", true);

log4net.config 文件如下:

<log4net>
      <appender name="LogsOnly" type="log4net.Appender.RollingFileAppender">
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
        <file value="InfoLogs/" />
        <datePattern value="yyyy-MM-dd'.log'" />
        <staticLogFileName value="false" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.fff} [%thread] [%property{Context}] %-5level %logger - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
          <levelMin value="DEBUG" />
          <levelMax value="WARN" />
        </filter>
        <filter type="log4net.Filter.DenyAllFilter" />
      </appender>
    <appender name="DebugOnly" type="log4net.Appender.RollingFileAppender">
    <threshold value="OFF" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <file value="DebugLogs/" />
    <datePattern value="yyyy-MM-dd'.log'" />
    <staticLogFileName value="false" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.fff} [%thread] [%property{Context}] %-5level %logger - %message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="DEBUG" />
    <levelMax value="DEBUG" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    </appender>
      <root>
        <appender-ref ref="LogsOnly" />
      </root>
    <logger name="DebugOnlyLogger">
    <log4net>
    <appender name="LogsOnly" type="log4net.Appender.RollingFileAppender">
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
        <file value="InfoLogs/"/>
        <datePattern value="yyyy-MM-dd'.log'"/>
        <staticLogFileName value="false"/>
        <appendToFile value="true"/>
        <rollingStyle value="Composite"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.fff} [%thread] [%property{Context}] %-5level %logger - %message%newline"/>
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG"/>
            <levelMax value="WARN"/>
        </filter>
        <filter type="log4net.Filter.DenyAllFilter"/>
    </appender>
    <appender name="DebugOnly" type="log4net.Appender.RollingFileAppender">
        <threshold value="OFF"/>
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
        <file value="DebugLogs/"/>
        <datePattern value="yyyy-MM-dd'.log'"/>
        <staticLogFileName value="false"/>
        <appendToFile value="true"/>
        <rollingStyle value="Composite"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.fff} [%thread] [%property{Context}] %-5level %logger - %message%newline"/>
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG"/>
            <levelMax value="DEBUG"/>
        </filter>
        <filter type="log4net.Filter.DenyAllFilter"/>
    </appender>
    <root>
        <appender-ref ref="LogsOnly"/>
    </root>
    <logger name="DebugOnlyLogger">
        <level value="DEBUG"/>
        <appender-ref ref="DebugOnly"/>
    </logger>
</log4net>

    </logger>
</log4net> 

在类库中,使用以下代码设置 ILog 实例:

var log4net.ILog log = log4net.LogManager.GetLogger("DebugOnlyLogger");

通过这个配置:

  • 附加程序 LogsOnly 在登录 WebAPI 项目期间工作。
  • 附加程序 DebugOnly 也适用于类库。

我的问题是,我想通过更改 log4net.config 文件来关闭 DebugOnlyLogger 的日志记录,如下所示:

<logger name="DebugOnlyLogger">
    <level value="OFF" />
    <appender-ref ref="DebugOnly" />
</logger>

但是类库中的记录器无法识别更改,即使 log4net 以参数 watch = true 启动(参见 AddLog4Net("log4net.config", true))。 类库中的记录器保持在 DEBUG 级别记录。

我错过了什么?我尝试了几种类似的方法,但都没有解决问题:

  • 使用 log4net.Config.XmlConfigurator.Configure() 方法在类库中重新加载和重新配置。
  • 在登录类库之前触发 RaiseConfigurationChanged 事件。
  • 在 DebugOnly 附加程序中设置 Threshold=OFF。

我不想通过在每个类库中引入单独的自定义配置文件来实现快速而肮脏的解决方案。正确的解决方法应该是只使用 log4net.config 文件,但是如何实现呢?

【问题讨论】:

    标签: class configuration log4net


    【解决方案1】:

    经过仔细检查,问题通过在Startup.cs中进行如下更改解决

    loggerFactory.AddLog4Net(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "log4net.config"), true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2013-11-26
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多