雁过请留痕...
代码改变世界

log4net使用总结

2012-06-20 17:08  xiashengwang  阅读(859)  评论(2编辑  收藏  举报

一,log4net是什么

log4net架构下用于记录日志的开源组件,功能相当完善,免去了我们重复造轮子。我想不管是winform还是web都需要记录日志。

官网下载地址:http://logging.apache.org/log4net/

SDK地址:http://logging.apache.org/log4net/release/sdk/index.html

二,怎样使用

新建了一个LogHelper类包装了一下,自己使用起来也方便。

注意这一句[assembly:log4net.Config.XmlConfigurator(Watch=true)]不要忘了,否则读不到配置文件

※ xml的配置文件的话,ConfigFile是必须的。[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", Watch = true)]

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;

[assembly:log4net.Config.XmlConfigurator(Watch=true)]
namespace Cshapr3._0NewFeature
{
    /// <summary>
    /// Log's Type
    /// </summary>
    public enum LogType
    {
        Debug,
        Info,
        Warning,
        Error,
        Fatal
    }

    /// <summary>
    /// Log Output Helper,use log4net
    /// author:wz
    /// </summary>    
    public static class LogHelper
    {
        private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        /// <summary>
        /// Nomal Information Output
        /// LogType:Info
        /// </summary>
        /// <param name="message">message</param>
        public static void Write(string message)
        {
            WriteInner(LogType.Info, message, null);
        }

        /// <summary>
        /// Error Information Output
        /// LogType:Error
        /// </summary>
        /// <param name="message">message</param>
        /// <param name="ex">exception</param>
        public static void Write(string message, Exception ex)
        {
            WriteInner(LogType.Error, message, ex);
        }

        /// <summary>
        /// special LogType's Information Output
        /// </summary>
        /// <param name="logType">LogType</param>
        /// <param name="message">message</param>
        /// <param name="ex">ex</param>
        public static void Write(LogType logType, string message, Exception ex)
        {
            WriteInner(logType, message, ex);
        }

        private static void WriteInner(LogType logType, string message, Exception ex)
        {
            switch (logType)
            {
                case LogType.Debug:
                    log.Debug(message, ex);
                    break;
                case LogType.Info:
                    log.Info(message, ex);
                    break;
                case LogType.Warning:
                    log.Warn(message, ex);
                    break;
                case LogType.Error:
                    log.Error(message, ex);
                    break;
                case LogType.Fatal:
                    log.Fatal(message, ex);
                    break;

            }
        }
    }
}

配置文件 

在应用程序配置文件中配置的话,要加入下面的这个section

      <section name ="log4net" type ="System.Configuration.IgnoreSectionHandler"/>
 大多数情况我们都会用RollingFileAppender的记录方式,这个可以实现回滚,log文件满了会新建log1,log2进行记录。

看看下面的官方举例

1)按照文件大小分块。满100KB,会记入新的文件,最大10个文件后重新覆盖第一个文件。文件名如:log,log1,log2

 

View Code
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="100KB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

 

2)按照时间分块。后缀名带时间格式。如:log20070102

 

View Code
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="logfile" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd-HHmm" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

 

3)按照时间和大小一起分组。保留每天的前10个1M的log文件。

 

View Code
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="logfile" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

 

4)每次程序启动都用一个单独的log,下次启动将上次的备份。

 

View Code
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="logfile.txt" />
    <appendToFile value="false" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="-1" />
    <maximumFileSize value="50GB" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

 

filter过滤级别:

 

View Code
    <appender name="RollingFileAppender_Composite" type="log4net.Appender.RollingFileAppender">
      <file value="log_composite.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datepattern value="yyyyMMddHHmm"/>
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="5KB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="FATAL"/>
        <param name="LevelMax" value="FATAL"/>
      </filter>
    </appender>

 


Appender部分参数的含义:

file:指定log文件名。如:<file value="log.txt" />
appendToFile:true表示在文件末尾追加,false:覆盖原有信息。这个应该是程序重新启动后对原log文件的处理方式,而不是指每写一次
都覆盖。
rollingStyle:Size表示按大小分块,Date表示按日期分块(这和datePattern指定的格式有极大的关系,如指定为“yyyyMMddHHmm”则没分钟都会生成一个log文件)。Composite表示兼容模式,前面两种模式同时制约有效。
datePattern:分组文件的日期后缀格式。如指定为“yyyyMMddHHmm”,生成的文件就是:log.txt201206211708。
maxSizeRollBackups:分块数。如:<maxSizeRollBackups value="10" />最大可以分成10个文件。
maximumFileSize:每个文件的最大Size。
staticLogFileName :true代表由file指定的文件名是固定的,也就是每次写入的都是log.txt这个文件。false:表示文件名不是固定的。rollingStyle为Date,Composite,这个属性不要指定。
conversionPattern:log出力的格式,这其中有很多log4net定义的参数,具体含义如下:
 %thread 线程ID。
 %message或%m 输出的消息内容。
 %date{yyyy/MM/dd HH:mm:ss fff}:日期时间,不指定{}里的内容的话将使用默认格式,精确到毫秒。%d
 %-5level log的级别,-5表示占用5个字符(左)。
 %logger 表示调用log.Info,log.Error的类的全名。
 %property{NDC} 输出NDC里的内容。
 %newline或%n 换行。
 %X{mdcName} 输出MDC里名为“mdcName”的对象的值。

root:这里定义了要使用的appender,通过appender-ref定义,还可以指定log的输出级别,通过level指定。

 

View Code
    <root>
      <!--<level value="WARN" />-->
      <level value="ALL"/>
      <appender-ref ref ="LogFileAppender"/>
      <appender-ref ref ="RollingFileAppender"/>
    </root>

 

在App.config中的一个完整配置:

 

View Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
      <section name ="log4net" type ="System.Configuration.IgnoreSectionHandler"/>
    </configSections>
  <appSettings>
    
  </appSettings>
  <log4net>

    <appender name="RollingFileAppender_Size" type="log4net.Appender.RollingFileAppender">
      <file value="log_size.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingFileAppender_Date" type="log4net.Appender.RollingFileAppender">
      <file value="log_date.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datepattern value="yyyyMMddHHmm"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingFileAppender_Composite" type="log4net.Appender.RollingFileAppender">
      <file value="log_composite.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <datepattern value="yyyyMMddHHmm"/>
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="5KB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingLogFileAppender_Once" type="log4net.Appender.RollingFileAppender">
      <file value="log_Once.txt" />
      <appendToFile value="false" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="-1" />
      <maximumFileSize value="50GB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>

    <root>
      <!--<level value="WARN" />-->
      <level value="ALL"/>
      <appender-ref ref ="RollingFileAppender_Size"/>
      <appender-ref ref ="RollingFileAppender_Date"/>
      <appender-ref ref ="RollingFileAppender_Composite"/>
      <appender-ref ref ="RollingLogFileAppender_Once"/>
    </root>
  </log4net>
</configuration>

 

三,理解配置文件

1,配置文件最详细的解释无疑是官方文档

http://logging.apache.org/log4net/release/config-examples.html 

2,PatternLayout的参数该如何配置,每个参数的意思是什么,往往让我们感到迷惑。

在这里能找到全部的答案。(官方的当然是最详细的)

http://logging.apache.org/log4net/release/sdk/log4net.Util.PatternString.html

http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html