5月 27

log4net不用介绍了,很久以前就在使用了 零配置使用Log4Net

 

确实非常方便,一般小项目都是直接调用就好了,免除了配置的麻烦,直到最近遇到点小麻烦.

在一个站点我需要两个logger实例,记录两种类型的日志,并且把文件也分开到两个地方,但是实际用下来发现无法分离log内容,会有很多重复.

 

查了之后才明白,每个logger都会继承父类的东西,需要设置logger的additivity属性即可,

就像这样.

   <logger name='loggerRoot'  additivity='false'>

 可惜,我翻遍了也没找到可以用code设置additivity的方法.

 

找到配置的初始化方法.

//默认配置,就是把配置写到config文件的那种
public static ICollection Configure();
//配置从一个文件读取
public static ICollection Configure(FileInfo configFile);
//配置从一个流中获取
public static ICollection Configure(Stream configStream);

灵机一动.把配置字符串以流方式传进去实例化,规避配置文件

        static LogHelper()
        { 
            string xml = @"
  <log4net>
   <logger name='loggerRoot'  additivity='false'>
      <level value='ALL' />
      <appender-ref ref='LogAppender' />
    </logger>
   <logger name='loggerExe'  additivity='false'>
      <level value='ALL' />
      <appender-ref ref='LogExeAppender' />
    </logger>
  <appender name='LogAppender' type='log4net.Appender.RollingFileAppender'>
      <param name='File' value='logs/' />
      <param name='AppendToFile' value='true' /> 
      <param name='RollingStyle' value='Date' />
      <param name='DatePattern' value='yyyy.MM.dd"".log""' />
      <param name='StaticLogFileName' value='false' />
      <lockingModel type='log4net.Appender.FileAppender+MinimalLock' />
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='[%d][%p] - %m%n' />
      </layout>
    </appender>
  <appender name='LogExeAppender' type='log4net.Appender.RollingFileAppender'>
      <param name='File' value='logs/visit/' />
      <param name='AppendToFile' value='true' /> 
      <param name='RollingStyle' value='Date' />
      <param name='DatePattern' value='yyyy.MM.dd.HH"".log""' />
      <param name='StaticLogFileName' value='false' />
      <lockingModel type='log4net.Appender.FileAppender+MinimalLock' />
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='[%d][%p] - %m%n' />
      </layout>
    </appender>
  </log4net>
";
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {
                XmlConfigurator.Configure(stream);
            }
            logger = LogManager.GetLogger("loggerRoot");
           
        }
        static log4net.ILog logger = null;

试了一下果然可以了,从此可以以通用的方式定制自己的零配置log组件,太棒了,给自己点个赞

2017.6.21更新

加入asp.net core下的初始化方法

    static LogHelper()
        {
            string xml = @"
  <log4net>
   <logger name='loggerRoot'  additivity='false'>
      <level value='ALL' />
      <appender-ref ref='LogAppender' />
    </logger>
  <appender name='LogAppender' type='log4net.Appender.RollingFileAppender'>
      <param name='File' value='logs/' />
      <param name='AppendToFile' value='true' /> 
      <param name='RollingStyle' value='Date' />
      <param name='DatePattern' value='yyyy.MM.dd"".log""' />
      <param name='StaticLogFileName' value='false' />
      <lockingModel type='log4net.Appender.FileAppender+MinimalLock' />
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='[%d][%p] - %m%n' />
      </layout>
    </appender>
  </log4net>
";

            ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository");
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {               
                XmlConfigurator.Configure(repository, stream);
            }
            logger = LogManager.GetLogger(repository.Name, "loggerRoot");

        }

written by ocean \\ tags: ,