如何解决log4net 配置文件更改不会反映到类库中的记录器中
我在使用 log4net 日志库时遇到问题。
有 3 个项目。
- .Net Core v2.2 WebAPI(添加了 log4net 库,添加了 log4net.config) - 使用以下类库
- .Net Standard v2.0 类库(添加了 log4net 库)
- .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");
通过这个配置:
- appender LogsOnly 在登录 WebAPI 项目期间起作用。
- appender 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 appender 中设置 Threshold=OFF。
我不想通过在每个类库中引入单独的自定义配置文件来实现快速而肮脏的解决方案。正确的解决方法应该是只使用 log4net.config 文件,但是如何实现?
解决方法
经过仔细检查,在Startup.cs中做如下改动解决了问题
loggerFactory.AddLog4Net(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"log4net.config"),true);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。