Fork me on GitHub

Log4net

参考文档:http://www.cnblogs.com/LiZhiW/p/4317198.html

一、关联配置文件

1,三种配置方式的方式

①    默认web.config/app.config

//监视默认的配置文件,App.exe.config 

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

②    独立配置文件(<项目名称>.exe. log4net)(例如ConsoleApplication1.exe.log4net)

//配置文件:App.exe.log4net

[assembly:log4net.Config.XmlConfigurator(ConfigFileExtension= "log4net")]

③    独立配置文件log4net.config

//配置文件:log4net.config

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

也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
        log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:/log4net.config"));

 

2,log4net.Config.XmlConifguratorAttribute

ConfigFile:配置文件的名字,文件路径相对于应用程序目录

ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用

Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载

 

二、案例

1,输出到文本

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="AdoNetAppender_file" type="log4net.Appender.RollingFileAppender">
      <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件-->
      <param name= "File" value= "D:\App_Log\Debug\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--记录日志写入文件时,不锁定文本文件-->
      <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />-->
      <!--Unicode编码-->
      <!--<Encoding value="UTF-8" />-->
      <!--最多产生的日志文件数,value="-1"为不限文件数-->
      <!--<param name="MaxSizeRollBackups" value="100" />-->
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "30"/>
      <!--日志文件名是否是固定不变的(是否只写到一个文件中)-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <param name="RollingStyle" value="Date" />
      <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]日志文件名格式为:2008-08-31.log -->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--<param name= "DatePattern" value= "yyyy-MM/yyyy-MM-dd&quot;.log&quot;"/>-->
      <!--每个文件的大小。只在[混合方式与文件大小方式]下使用,超出大小的在文件名后自动增加1重新命名-->
      <param name="maximumFileSize" value="500KB" />
      <!--记录的格式。-->
      <layout type="log4net.Layout.PatternLayout">
        <!--
        %d, %date     :表示当然的时间
      %p, %level    :表示日志的级别
      %c, %logger   :表示日志产生的主题或名称,通常是所在的类名,便于定位问题
      %m, %message  :表示日志的具体内容
      %n, %newline  :换行
        %exception    :表示异常信息
        -->
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %exception %n" />
      </layout>
    </appender>
    <logger name="Test" additivity="true">
      <level value="ALL"/>
      <appender-ref ref="AdoNetAppender_file" />
    </logger>
  </log4net>
</configuration>
log4net.config
using System;
using log4net;

namespace LogDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ILog log = log4net.LogManager.GetLogger("Test");
            log.Error("错误", new Exception("发生了一个异常"));//错误
            log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误
            log.Info("信息"); //记录一般信息
            log.Debug("调试信息");//记录调试信息
            log.Warn("警告");//记录警告信息

            Console.WriteLine("日志记录完毕。");
            Console.Read();
        }
    }
}
Program.cs

案例下载:http://pan.baidu.com/s/1nuU4f93

<param name= "File" value= "log\"/>文件配置格式 

 

2,输出到数据库

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="AdoNetAppender_mysql" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="0" /><!--0:只要有一条就立刻写到数据库。4:第5条时写入数据库-->
      <!--日志数据库连接串mysql-->
      <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
      <connectionString value="server=localhost;user id=root;pwd=123456;port=3306;pooling=True;database=xinleda" providerName="MySql.Data.MySqlClient;" />
      <!--日志数据库脚本(注意:mysql不需要[]符号)-->
      <commandText value="INSERT INTO LogDetails(LogDate,Thread,Level,Logger,Message) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
      <!--参数-->
      <parameter>
        <parameterName value="@logDate" />
        <dbType value="Datetime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logLevel" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>
    <logger name="Test" additivity="true">
      <level value="ALL"/>
      <appender-ref ref="AdoNetAppender_mysql" />
    </logger>
  </log4net>
</configuration>
log4net.config

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Config;
using System.IO;

namespace LogDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ILog log = log4net.LogManager.GetLogger("Test");
            log.Error("错误", new Exception("发生了一个异常"));//错误
            log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误
            log.Info("信息"); //记录一般信息
            log.Debug("调试信息");//记录调试信息
            log.Warn("警告");//记录警告信息
            Console.WriteLine("日志记录完毕。");
            Console.Read();
        }
    }
}
Program.cs

 

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("LogDemo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LogDemo")]
[assembly: AssemblyCopyright("Copyright ©  2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

//将 ComVisible 设置为 false 将使此程序集中的类型
//对 COM 组件不可见。  如果需要从 COM 访问此程序集中的类型,
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("3cef5427-d026-46c8-a73a-083215681098")]

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

// 程序集的版本信息由下列四个值组成:
//
//      主版本
//      次版本
//      生成号
//      修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
AssemblyInfo.cs

注意:如果是链接到mysql需要引用组件MySql.Data

案例下载:http://pan.baidu.com/s/1c1QIF0s

 

3,自定义字段输出到数据库

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="AdoNetAppender_mysql" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="0" /><!--0:只要有一条就立刻写到数据库。4:第5条时写入数据库-->
      <!--日志数据库连接串mysql-->
      <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" />
      <connectionString value="server=localhost;user id=root;pwd=123456;port=3306;pooling=True;database=xinleda" providerName="MySql.Data.MySqlClient;" />
      <!--日志数据库脚本(注意:mysql不需要[]符号)-->
      <commandText value="INSERT INTO LogDetails(LogDate,Thread,Level,Logger,Message,Content,Age) VALUES (@logDate, @thread, @logLevel, @logger,@message,@Content,@Age)" />
      <!--参数-->
      <parameter>
        <parameterName value="@logDate" />
        <dbType value="Datetime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logLevel" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="240" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Content" />
        <dbType value="String" />
        <size value="240" />
        <layout type="LogDemo.MessageLayout">
          <conversionPattern value="%Content" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Age" />
        <layout type="LogDemo.MessageLayout">
          <conversionPattern value="%Age" />
        </layout>
      </parameter>
    </appender>
    <logger name="Test" additivity="true">
      <level value="ALL"/>
      <appender-ref ref="AdoNetAppender_mysql" />
    </logger>
  </log4net>
</configuration>
log4net.config

 

using log4net.Layout.Pattern;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net.Core;
using System.IO;
using log4net.Layout;

namespace LogDemo
{
    //自定义字段
    public class LogMassage
    {
        public string Content { get; set; }
        public int Age { get; set; }
        public DateTime Dt { get; set; }
    }

    public sealed class ContentPatternConverter : PatternLayoutConverter
    {
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            var log =loggingEvent.MessageObject as LogMassage;
            if (log != null)
            {
                writer.Write(log.Content);
            }
        }
    }
    public sealed class AgePatternConverter : PatternLayoutConverter
    {
        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            var log = loggingEvent.MessageObject as LogMassage;
            if (log != null)
            {
                writer.Write(log.Age);
            }
        }
    }

    public class MessageLayout : PatternLayout
    {
        public MessageLayout()
        {
            this.AddConverter("Content", typeof(ContentPatternConverter));
            this.AddConverter("Age", typeof(AgePatternConverter));
        }
    }

}
View Code

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Config;
using System.IO;

namespace LogDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ILog log = log4net.LogManager.GetLogger("Test");
            log.Error("错误", new Exception("发生了一个异常"));//错误
            log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误
            log.Info("信息"); //记录一般信息
            log.Debug("调试信息");//记录调试信息
            log.Warn("警告");//记录警告信息

            //记录自定义字段
            var m = new LogMassage();
            m.Content = "asdasd";
            m.Age = 123;
            m.Dt = DateTime.Now;
            log.Info(m);

            Console.WriteLine("日志记录完毕。");
            Console.Read();
        }
    }
}
Program.cs

案例下载:http://pan.baidu.com/s/1hrNSB8C

 

三、配置详情

 1,logger节点配置详解

    <!--name:必须的,logger的名称,在代码中得到ILog对象时用到-->
    <!--additivity:可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender-->
    <logger name="Test" additivity="true">
      <level value="ALL"/><!--日志级别等级。高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL-->
      <appender-ref ref="AdoNetAppender_mysql" /><!--0个或多个,要引用的appender的名字-->
    </logger>

 2,filter节点配置详解

filter只能作为<appender>的子元素,type属性表示Filter的类型

DenyAllFilter       阻止所有的日志事件被记录

LevelMatchFilter    只有指定等级的日志事件才被记录

LevelRangeFilter    日志等级在指定范围内的事件才被记录

①记录日志等级为“FATAL”和“ERROR”的日志信息

<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="FATAL"/>
</filter>
<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="ERROR"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter"/>

②记录日志等级范围从“ERROR”到“INFO”的日志信息:

      <filter type="log4net.Filter.LevelRangeFilter">
         <levelMax value="ERROR"/>
         <levelMin value="INFO"/>
      </filter>

 3,Layout节点配置详解

layout节点只能作为<appender>的子元素。type属性表示Layout的类型

①layout节点的type属性取值

ExceptionLayout

只呈现日志事件中异常的文本信息

PatternLayout

可以通过类型字符串来配置的布局

RawPropertyLayout

从日志事件中提取属性值

RawTimeStampLayout

从日志事件中提取日期

RawUtcTimeStampLayout

从日志事件中提取UTC日期

SimpleLayout

很简单的布局

XmlLayout

把日志事件格式化为XML元素的布局

②PatterLayout的格式化字符串

%m、%message

输出的日志消息

%d、%datetime

输出当前语句运行的时刻,格式%date{yyyy-MM-dd   HH:mm:ss,fff}

%r、%timestamp

输出程序从运行到执行到当前语句时消耗的毫秒数

%p、%level

日志的当前优先级别

%c、%logger

当前日志对象的名称

%L、%line

输出语句所在的行号

%F、%file

输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能

%a、%appdomain

引发日志事件的应用程序域的名称。

%C、%class、%type

引发日志请求的类的全名,警告:会影响性能

%exception

异常信息

%u、%identity

当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能

%l、%location

引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件

%M、%method

发生日志请求的方法名,警告:会影响性能

%n、%newline

换行符

%x、%ndc

NDC(nested diagnostic context)

%X、%mdc、%P、%properties

等介于 %property

%property

输出{log4net:Identity=, log4net:UserName=,   log4net:HostName=}

%t、%thread

引发日志事件的线程,如果没有线程名就使用线程号。

%w、%username

当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能

%utcdate

发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}

%%

输出一个百分号

 
③案例
 
      <parameter>
        <parameterName value="@logDate" />
        <dbType value="Datetime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>

 

 
 

posted on 2017-06-19 13:04  *Hunter  阅读(222)  评论(0编辑  收藏  举报

导航

AmazingCounters.com