使用log4net动态创建日志文件

log4net简述

log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个非常优秀的开源日志记录组件。log4net记录日志的功能强大,可将日志分不同等级,以不同格式,输出到不同媒介。

log4net有四种主要的组件,分别是Logger(记录器)、Repository(库)、Appender(附着器)以及Layout(布局)。

日志优先级别从高到低分别为:

  • OFF
  • FATAL
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • ALL

支持的Appender有:

  • AdoNetAppender
  • ConsoleAppender
  • DebugAppender
  • EventLogAppender
  • FileAppender
  • RollingFileAppender
  • 等等

在C#程序中使用log4net

引用log4net.dll

下载log4net.dll,添加到项目引用中。

指定log4net配置文件

在[Project Name]\Properties\AssemblyInfo.cs中,指定log4net配置文件路径及配置。

[assembly: log4net.Config.XmlConfigurator(ConfigFile="log4net.config",Watch = true)]

XmlConfiguratorAttribute有3个属性:

  • ConfigFile: 配置文件的路径及文件名,包括扩展名。文件路径相对于应用程序目录(AppDomain.CurrentDomain.BaseDirectory)。
  • ConfigFileExtension: 配置程序集的配置文件扩展名,默认为”config”。
  • Watch: 如果将Watch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会重新加载。

ConfigFile属性不能和ConfigFileExtension属性一起使用。ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”;ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名,例如,应用程序的名称是”test.exe”,ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt”。

如果ConfigFile和ConfigFileExtension都没有设置,则使用应用程序的配置文件App.config(Web.config)。

配置文件

配置方法参见Apache log4net™ Manual – Configuration

log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="Loging" />
      <appender-ref ref="EventLoging" />
      <appender-ref ref="ErrorLoging" />
    </root>
    <logger name="MyLogger">
      <level value="INFO" />
    </logger>
    <logger name="logger_C2S.DATA.1.BZ.GDX1.1" additivity="false" >
      <level value="INFO" />
      <appender-ref ref="appender_C2S.DATA.1.BZ.GDX1.1" />
    </logger>
    <logger name="logger_Channel" additivity="false" >
      <level value="INFO" />
      <appender-ref ref="appender_Channel" />
    </logger>
    <!--频道日志-->
    <appender name="appender_C2S.DATA.1.BZ.GDX1.1" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="Log\C2S.DATA.1.BZ.GDX1.1.log" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="false" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="1GB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"  />
      </layout>
    </appender>
    <!--频道默认日志-->
    <appender name="appender_Channel" type="log4net.Appender.RollingFileAppender,log4net">
      <file type="log4net.Util.PatternString" value="Log\%property{Channel}.log"/>
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="false" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="1GB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n"  />
      </layout>
    </appender>
    <!--信息日志-->
    <appender name="Loging" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="Log\info.log" />
      <param name="RollingStyle" value="Size" />
      <!--<param name="DatePattern" value="&quot;info.log&quot;" />-->
      <param name="StaticLogFileName" value="false" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="50MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
    </appender>
    <!--警告,注意,通知日志-->
    <appender name="EventLoging" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log\event.log" />
      <param name="RollingStyle" value="Size" />
      <!--<param name="DatePattern" value="&quot;event.log&quot;" />-->
      <param name="StaticLogFileName" value="false" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="50MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="WARN" />
        <param name="LevelMax" value="WARN" />
      </filter>
    </appender>
    <!--错误日志-->
    <appender name="ErrorLoging" type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="Log\error.log" />
      <param name="RollingStyle" value="Size" />
      <!--<param name="DatePattern" value="&quot;error.log&quot;" />-->
      <param name="StaticLogFileName" value="false" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="50MB" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="ERROR" />
      </filter>
    </appender>
  </log4net>
</configuration>

在程序中记录日志

创建logger对象:

protected static log4net.ILog log = log4net.LogManager.GetLogger("MyLogger");

在需要的位置记录日志信息:

  • log.Info(“message”);
  • log.Debug(“message”);
  • log.Warn(“message”);

动态修改日志文件路径

参考自changing log4net log file path via code

在log4net配置文件中使用全局变量定义日志文件路径,如Log\%property{Channel}.log

<logger name="logger_Channel" additivity="false" >
    <level value="INFO" />
    <appender-ref ref="appender_Channel" />
</logger>
<appender name="appender_Channel" type="log4net.Appender.RollingFileAppender,log4net">
      <file type="log4net.Util.PatternString" value="Log\%property{Channel}.log"/>

在[Project Name]\Program.cs中设置log4net全局变量的初始值,如Channel

log4net.GlobalContext.Properties["Channel"] = "Channel";

根据业务需要,在程序中动态修改全局变量:

log4net.GlobalContext.Properties["Channel"] = curChannel.ToString();
log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));

此时,使用logger_Channel记录器就可以将日志信息动态记录到不同的文件。

var channelLog = log4net.LogManager.Exists("logger_Channel");
if (channelLog != null)
{
    channelLog.Info(logContent);
}




Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>