zoukankan      html  css  js  c++  java
  • log4net使用详解

    说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。要想获取最新版本的log4net组件库,可以到官方网站http://logging.apache.org/log4net/下载。现在的最新版本是1.2.10。

    下面的例子展示了如何利用log4net记录日志 。

    首先从官方网站下载最近版本的log4net组件,现在的最新版本是1.2.10。在程序中我们只需要log4net.dll文件就行了,添加对log4net.dll的引用,就可以在程序中使用了。

    接着我们配置相关的配置文件(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例中是控制台应用程序,配置如下(附各配置的说明):

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
      </configSections>
      <appSettings>
      </appSettings>
      <log4net>
        <!--定义输出到文件中-->
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
          <!--定义文件存放位置-->
          <file value="D:/log4netfile.txt" />
          <appendToFile value="true" />
          <rollingStyle value="Date" />
          <datePattern value="yyyyMMdd-HH:mm:ss" />
          <layout type="log4net.Layout.PatternLayout">
            <!--每条日志末尾的文字说明-->
            <footer value="by 周公" />
            <!--输出格式-->
            <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
            <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
          </layout>
        </appender>
        <!--定义输出到控制台命令行中-->
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
          </layout>
        </appender>
        <!--定义输出到windows事件中-->
        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
          </layout>
        </appender>
        <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
        <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
          <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
          <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
          <!--定义各个参数-->
          <parameter>
            <parameterName value="@logDate" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%date" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@thread" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="%thread" />
            </layout>
          </parameter>
          <parameter>
            <parameterName value="@logLevel" />
            <dbType value="String" />
            <size value="240" />
            <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>
        <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
        <root>
          <!--文件形式记录日志-->
          <appender-ref ref="LogFileAppender" />
          <!--控制台控制显示日志-->
          <appender-ref ref="ConsoleAppender" />
          <!--Windows事件日志-->
          <appender-ref ref="EventLogAppender" />
          <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉
          <appender-ref ref="AdoNetAppender_Access" />
          -->
        </root>
        
      </log4net>
    </configuration>
     程序文件:
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    using System.Reflection;
    using log4net;
    
    //注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息
    //如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件)
    //如果是WebForm,则从web.config中读取相关信息
    [assembly: log4net.Config.XmlConfigurator(Watch = true)]
    namespace Log4NetDemo
    {
        /// <summary>
        /// 说明:本程序演示如何利用log4net记录程序日志信息。log4net是一个功能著名的开源日志记录组件。
        /// 利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库中(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)。
        /// 下面的例子展示了如何利用log4net记录日志
        /// </summary>
        public class MainClass
        {
            public static void Main(string[] args)
            {
                //Application.Run(new MainForm());
                //创建日志记录组件实例
                ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
                //记录错误日志
                log.Error("error",new Exception("发生了一个异常"));
                //记录严重错误
                log.Fatal("fatal",new Exception("发生了一个致命错误"));
                //记录一般信息
                log.Info("info");
                //记录调试信息
                log.Debug("debug");
                //记录警告信息
                log.Warn("warn");
                Console.WriteLine("日志记录完毕。");
                Console.Read();
            }
        }
    }
    
    

     手工配置:

     1 static bool InitializeLogSystem()  
     2 {  
     3   // 通过配置文件偷来的配置项  
     4   //<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">  
     5   //  <file value="Data/RollingLogFile.log" />  
     6   //  <appendToFile value="true" />  
     7   //  <maxSizeRollBackups value="3" />  
     8   //  <maximumFileSize value="1MB" />  
     9   //  <rollingStyle value="Size" />  
    10   //  <staticLogFileName value="true" />  
    11   //  <layout type="log4net.Layout.PatternLayout">  
    12   //    <conversionPattern value="%date [%thread] %-5level %logger [%property{url}] - %message%newline" />  
    13   //  </layout>  
    14   //</appender>  
    15   log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();  
    16   // winform 的取路径方式呢  
    17   appender.File = System.IO.Path.Combine(Application.StartupPath, "RollingLogFile.log");  
    18   appender.AppendToFile = true;  
    19   appender.MaxSizeRollBackups = 3;  
    20   appender.MaximumFileSize = "1MB";  
    21   appender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size;  
    22   appender.StaticLogFileName = true;  
    23   appender.Layout = new log4net.Layout.PatternLayout("%date [%thread] %-5level - %message%newline");  
    24   appender.ActivateOptions();// 这个要调用一下呢  
    25   log4net.Config.BasicConfigurator.Configure(appender);  
    26   return true;  
    27 }  

    PatterLayout格式化字符表

    转换字符

    效果

    a

    等价于appdomain

    appdomain

    引发日志事件的应用程序域的友好名称。(使用中一般是可执行文件的名字。)

    c

    等价于 logger

    C

    等价于 type

    class

    等价于 type

    d

    等价于 date

    date

    发生日志事件的本地时间。 使用 DE>%utcdate 输出UTC时间。date后面还可以跟一个日期格式,用大括号括起来。DE>例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。如果date后面什么也不跟,将使用ISO8601 格式 。

    日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。

    另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如:%date{ISO8601}或%date{ABSOLUTE}。

    它们的性能要好于ToString。

    exception

    异常信息

    日志事件中必须存了一个异常对象,如果日志事件不包含没有异常对象,将什么也不输出。异常输出完毕后会跟一个换行。一般会在输出异常前加一个换行,并将异常放在最后。

    F

    等价于 file

    file

    发生日志请求的源代码文件的名字。

    警告:只在调试的时候有效。调用本地信息会影响性能。

    identity

    当前活动用户的名字(Principal.Identity.Name).

    警告:会影响性能。(我测试的时候%identity返回都是空的。)

    l

    等价于 location

    L

    等价于 line

    location

    引发日志事件的方法(包括命名空间和类名),以及所在的源文件和行号。

    警告:会影响性能。没有pdb文件的话,只有方法名,没有源文件名和行号。

    level

    日志事件等级

    line

    引发日志事件的行号

    警告:会影响性能。

    logger

    记录日志事件的Logger对象的名字。

    可以使用精度说明符控制Logger的名字的输出层级,默认输出全名。

    注意,精度符的控制是从右开始的。例如:logger 名为 "a.b.c", 输出模型为%logger{2} ,将输出"b.c"。

    m

    等价于 message

    M

    等价于 method

    message

    由应用程序提供给日志事件的消息。

    mdc

    MDC (旧为:ThreadContext.Properties) 现在是事件属性的一部分。 保留它是为了兼容性,它等价于 property。

    method

    发生日志请求的方法名(只有方法名而已)。

    警告:会影响性能。

    n

    等价于 newline

    newline

    换行符

    ndc

    NDC (nested diagnostic context)

    p

    等价于 level

    P

    等价于 property

    properties

    等价于 property

    property

    输出事件的特殊属性。例如: %property{user} 输出user属性。属性是由loggers或appenders添加到时间中的。 有一个默认的属性"DE>log4net:HostName"总是会有。DE>

    %property将输出所有的属性 。

    (扩展后可以使用)

    r

    等价于 timestamp

    t

    等价于 thread

    timestamp

    从程序启动到事件发生所经过的毫秒数。

    thread

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

    type

    引发日志请求的类的全名。.

    可以使用精度控制符。例如: 类名是 "log4net.Layout.PatternLayout", 格式模型是%type{1} 将输出"PatternLayout"。(也是从右开始的。)

    警告:会影响性能。

    u

    等价于 identity

    username

    当前用户的WindowsIdentity。(类似:HostName/Username)

    警告:会影响性能。

    utcdate

    发生日志事件的UTC时间。DE>后面还可以跟一个日期格式,用大括号括起来。DE>例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}。如果utcdate后面什么也不跟,将使用ISO8601 格式 。

    日期格式和.Net中DateTime类的ToString方法中使用的格式是一样。

    另外log4net还有3个自己的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。例如:%date{ISO8601}或%date{ABSOLUTE}。

    它们的性能要好于ToString。

    w

    等价于 username

    x

    等价于 ndc

    X

    等价于 mdc

    %

    %%输出一个百分号

  • 相关阅读:
    宠物商店项目需求
    使用Ajax新闻系统管理需求分析
    java 面向对象面试题,问答题,构造方法,抽象类,继承,多态,接口,异常总结;
    如何在linux服务器部署Rstudio server,配置ODBC远程访问win 服务器上的SQL server
    R语言网络爬虫学习 基于rvest包
    用蒙特卡洛方法计算派-python和R语言
    R 语言学习日志 1
    kmeans聚类中的坑 基于R shiny 可交互的展示
    分类算法简介 基于R
    R 多线程和多节点并行计算
  • 原文地址:https://www.cnblogs.com/flywong/p/8853582.html
Copyright © 2011-2022 走看看