Asp.Net Core配置多环境log4net配置文件的全过程

2022-04-19 11:45:58
目录
前言配置log4net总结

前言

在之前的文章中有讲到AspNetCore多环境配置文件的应用,我们根据自己多种环境分别配置多个appsettings.$EnvironmentName.json文件。

在实际的开发中我们可能会遇到不只一个配置文件,如当我们使用log4net日志库时,喜欢使用单独的log4net.config配置文件。并且我们还遇到不同环境下的配置文件还存在差异。这时我们可能可以效仿appsettings.json多环境配置的风格实现多环境配置文件。

配置log4net

新建Web项目

Asp.NetCore配置多环境log4net配置文件的全过程

安装Microsoft.Extensions.Logging.Log4Net.AspNetCore

Asp.NetCore配置多环境log4net配置文件的全过程

创建两个环境的配置文件分别如图,并设置文件属性使其在发布时能够复制到根目录

Asp.NetCore配置多环境log4net配置文件的全过程

两个配置文件内容如下,例如我们这里生产环境的配置文件多增加一个KafkaAppender使日志发送至kafka消息丢列中,然后kafka的消费者将日志消费至ES集群,而本地开发的日志则没必要进行上传ES。

<!--log4net.config--><?xml version="1.0" encoding="utf-8" ?><log4net>  <!-- If you are looking here and want more output, first thing to do is change root/priority/@value to "INFO" or "ALL". -->  <root>    Value of priority may be ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF.    <priority value="ALL" />    <appender-ref ref="error-file" />    <appender-ref ref="debug-file" />    <appender-ref ref="KafkaAppender" />  </root>  <!-- Example of turning on the output from a component or namespace. -->  <logger name="Common">    <appender-ref ref="debugger"/>    <priority value="DEBUG" />  </logger>    <appender name="KafkaAppender" type="log4net.Kafka.Appender.KafkaAppender, log4net.Kafka.Appender">    <KafkaSettings>      <brokers>        <add value="127.0.0.1:9092" />      </brokers>      <topic type="log4net.Layout.PatternLayout">        <conversionPattern value="kafka.logstash" />      </topic>    </KafkaSettings>    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%date %level% [%t] %logger - %message" />    </layout>  </appender>    <appender name="debugger" type="log4net.Appender.DebugAppender">    <!-- Sends log messages to Visual Studio if attached. -->    <immediateFlush value="true" />    <layout type="log4net.Layout.SimpleLayout" />  </appender>  <appender name="debug-file" type="log4net.Appender.RollingFileAppender">    <param name="Encoding" value="utf-8" />    <file value="Logs/debug" />    <appendToFile value="true" />    <!-- Immediate flush on error log, to avoid data loss with sudden termination. -->    <immediateFlush value="true" />    <staticLogFileName value="false" />    <rollingStyle value="Date" />    <datepattern value="-yyyy.MM.dd'.logPkHvD'" />    <!-- Prevents Orchard.exe from displaying locking debug messages. -->    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%date %level% [%property{trace}] %logger - %message%newline" />    </layout>  </appender>  <appender name="error-file" type="log4net.Appender.RollingFileAppender">    <param name="Encoding" value="utf-8" />    <file value="Logs/error" />    <appendToFile value="true" />    <!-- Immediate flush on error log, to avoid data loss with sudden termination. -->    <immediateFlush value="true" />    <staticLogFileName value="false" />    <rollingStyle value="Date" />    <datepattern value="-yyyy.MM.dd'.log'" />    <!-- Prevents Orchard.exe from displaying locking debug messages. -->    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />    <filter type="log4net.Filter.LevelRangeFilter">      <!-- Only ERROR and FATAL log messages end up in this target, even if child loggers accept lower priority. -->      <levelMin value="ERROR" />    </filter>    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%date [%t] %logger - %message [%P{Url}]%newline" />    </layout>  </appender></log4net>
<!--log4net.Development.config--><?xml version="1.0" encoding="utf-8" ?><log4net>  <!-- If you are looking here and want more output, first thing to do is change root/priority/@value to "INFO" or "ALL". -->  <root>    Value of priority may be ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF.    <priority value="ALL" />    <appender-ref ref="error-file" />    <appender-ref ref="debug-file" />  </root>  <!-- Example of turning on the output from a component or namespace. -->  <logger name="Common">    <appender-ref ref="debugger"/>    <priority value="DEBUG" />  </logger>    <appender name="debugger" type="log4net.Appender.DebugAppenderPkHvD">    <!-- Sends log messages to Visual Studio if attached. -->    <immediateFlush value="true" />    <layout type="log4net.Layout.SimpleLayout" />  </appender>  <appender name="debug-file" type="log4net.Appender.RollingFileAppender">    <param name="Encoding" value="utf-8" />    <file value="Logs/debug" />    <appendToFile value="true" />    <!-- Immediate flush on error log, to avoid data loss with sudden termination. -->    <immediateFlush value="true" />    <staticLogFileName value="false" />    <rollingStyle value="Date" />    <datepattern value="-yyyy.MM.dd'.log'" />    <!-- Prevents Orchard.exe from displaying locking debug messages. -->    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%date %level% [%property{trace}] %logger - %message%newline" />    </layout>  </appender>  <appender name="error-file" type="log4net.Appender.RollingFileAppender">    <param name="Encoding" value="utf-8" />    <file value="Logs/error" />    <appendToFile value="true" />    <!-- Immediate flush on error log, to avoid data loss with sudden termination. -->    <immediateFlush value="true" />    <staticLogFileName value="false" />    <rollingStyle value="Date" />    <datepattern value="-yyyy.MM.dd'.log'" />    <!-- Prevents Orchard.exe from displaying locking debug messages. -->    <lockingModel type="log4net.Appender.PkHvDFileAppender+MinimalLock" />    <filter type="log4net.Filter.LevelRangeFilter">      <!-- Only ERROR and FATAL log messages end up in this target, even if child loggers accept lower priority. -->      <levelMin value="ERROR" />    </filter>    <layout type="log4net.Layout.PatternLayout">      <conversionPattern value="%date [%t] %logger - %message [%P{Url}]%newline" />    </layout>  </appender></log4net>

在Program.cs中添加log4net配置如下图

// ===============多环境log4net配置===============IWebHostEnvironment environment = builder.Environment;var configName = "log4net" + (environment.IsProduction() ? string.Empty : environment.EnvironmentName) + ".config";builder.Logging.AddLog4Net(configName, watch: true);// ===============多环境log4net配置===============

Asp.NetCore配置多环境log4net配置文件的全过程

现在所有的配置都完成了。

总结