Log4net日志记录组件-学习心得

时间:2021-07-08 11:17:50

Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是20017月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4jLog4net记录日志的功能非常强大。

  本文示例源代码或素材下载

  最近正在做一个大型网站,网站已经基本成型,到了后期维护和修改的阶段,经常会遇到某些页面打不开的状态,出现了未知的错误,回头想想,还是日志做的不详细,跟踪的不彻底,在网上搜了搜,找到了一个不错的关于.net 日志记录组件的文章,也是博客园的用户,也转载下,好好学习学习,然后应用到我的网站上。

  一Log4net简介

  Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是20017月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4jLog4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。

  Log4net可以从http://logging.apache.org/log4net/downloads.html网站下载最新版本。

  二 Log4net核心组成

  Log4net主要由五个部分组成,分别为LoggerAppenders,Filters, Layouts Object Renders

  一)     Logger(日志)

  1 记录日志的分类:

  Log4net能够以多种方式输出日志。支持的日志输出常用的主要媒介有数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制台,文件,事件日志(可以用事件查看器查看)和邮件等多种方式。

  2 日志的级别

  Log4net支持多种级别的日志。优先级从高到低依次排列如下:

  FATAL > ERROR> WARN > INFO > DEBUG

  此外还有ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求)这两种特殊的级别。

  二)     Appenders

  Appenders决定日志输出的方式。

  Appenders必须实现log4net.Appenders.IAppender接口。

Log4net目前支持的输出方式包括:

  1 AdoNetAppender

  将日志记录到数据库中。可以采用SQL和存储过程两种方式。

  2AnsiColorTerminalAppender

  在ANSI 窗口终端写下高亮度的日志事件。

  3AspNetTraceAppender

  能用asp.netTrace的方式查看记录的日志。

  4BufferingForwardingAppender

  在输出到子Appenders之前先缓存日志事件。

  5 ConsoleAppender

  将日志输出到控制台。

  6 EventLogAppender

  将日志写到Windows EventLog.

  7 FileAppender

  将日志写到文件中。

  8LocalSyslogAppender

  将日志写到local syslogservice (仅用于UNIX环境下).

  9 MemoryAppender

  将日志存到内存缓冲区。

  10 NetSendAppender

  将日志输出到WindowsMessenger service.这些日志信息将在用户终端的对话框中显示。

  11RemoteSyslogAppender

  通过UDP网络协议将日志写到Remotesyslog service

  12 RemotingAppender

  通过.NET Remoting将日志写到远程接收端。

  13RollingFileAppender

  将日志以回滚文件的形式写到文件中。

  14 SmtpAppender

  将日志写到邮件中。

  15 TraceAppender

  将日志写到.NET trace 系统。

  16 UdpAppender

  将日志connectionlessUDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

  三)     Filters

  Appender对象将日志以缺省的方式传到输出流,然后Filter可以按照不同的标准控制日志的输出。Filter可以再配置文件中配置。最简单的形式是在appender中写明一个Threshold.这样只有级别大于或等于此Threshold的日志才被记录。

  Filters必须实现log4net.Filters.IFilter接口。

  四)     Layouts

  Layouts控制日志显示的格式样式。日志的显示格式如下:

  "%timestamp[%thread] %-5level %logger - %message%newline"

  Timestamp: 表示程序已经开始执行的时间。 单位[毫秒]

  Thread:执行当前代码的线程。

  Level:日志的级别。

  Logger:日志相关请求的名称。

  Message: 日志消息。

  Layouts还可以控制日志的输出样式,比如以普通形式或以xml等形式输出。

  五)     ObjectRenderers

  这是很重要的一项,log4net将按照用户定义的标准输出日志消息。

  Object Renders必须实现log4net.ObjectRenderer.IObjectRenerer接口。

  三 如何在项目中使用log4net

  下面有个基于控制台的demo,举例描述了log4net怎么用于输出日志。

  本例中,日志将会记录到文件,控制台,事件日至和Access数据库中。

  一)主要代码:

  1. 配置文件app.config

  Code

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <!-- Register a section handler for the log4net section -->

  <configSections>

    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />

    <appSettings>

      <!-- To enable internal log4net logging specify the followingappSettings key -->

      <!-- <add key="log4net.Internal.Debug"value="true"/> -->

    </appSettings>

    <!-- This section contains the log4net configuration settings -->

    <log4net>

     

      <!--定义输出到文件中-->

      <appender name="LogFileAppender" type="log4net.Appender.FileAppender">

        <!--定义文件存放位置-->

        <file value="D:log-file1.txt" />

        <!-- Example using environment variables in params -->

        <!-- <file value="${TMP}log-file.txt" /> -->

        <!--<sppendToFile value="true" />-->

        <!-- An alternate output encoding can be specified -->

        <!-- <encoding value="unicodeFFFE" /> -->

        <layout type="log4net.Layout.PatternLayout">

          <!--每条日志末尾的文字说明-->

          <footer value="[Footer]--Test By Ring1981 " />

          <!--输出格式-->

          <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %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数据库中,数据库为D盘的access.mdb-->

      <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">

        <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:access.mdb" />

        <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message])VALUES (@log_date, @thread, @log_level, @logger, @message)" />

        <!--定义各个参数-->

        <parameter>

          <parameterName value="@log_date" />

          <dbType value="String" />

          <size value="255" />

          <layout type="log4net.Layout.PatternLayout">

            <conversionPattern value="%date" />

          </layout>

        </parameter>

       

        <parameter>

          <parameterName value="@thread" />

          <dbType value="String" />

          <size value="255" />

          <layout type="log4net.Layout.PatternLayout">

            <conversionPattern value="%thread" />

          </layout>

        </parameter>

       

        <parameter>

          <parameterName value="@log_level" />

          <dbType value="String" />

          <size value="50" />

          <layout type="log4net.Layout.PatternLayout">

            <conversionPattern value="%level" />

          </layout>

        </parameter>

       

        <parameter>

          <parameterName value="@logger" />

          <dbType value="String" />

          <size value="255" />

          <layout type="log4net.Layout.PatternLayout">

            <conversionPattern value="%logger" />

          </layout>

        </parameter>

       

        <parameter>

          <parameterName value="@message" />

          <dbType value="String" />

          <size value="1024" />

          <layout type="log4net.Layout.PatternLayout">

            <conversionPattern value="%message" />

          </layout>

        </parameter>

      </appender>

     

      <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->

      <root>

        <appender-ref ref="LogFileAppender" />

        <appender-ref ref="ConsoleAppender" />

        <appender-ref ref="EventLogAppender" />

        <appender-ref ref="AdoNetAppender_Access"/>

      </root>

    </log4net>

  </configuration>

2.LoggingExample.cs

  Code

//Configurelog4netusingthe.configfile

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

//Thiswillcauselog4nettolookforaconfigurationfile

//calledConsoleApp.exe.configintheapplicationbase

//directory(i.e.thedirectorycontainingConsoleApp.exe)

namespaceConsoleApp

{

  usingSystem;

  /**////<summary>

  ///Exampleofhowtosimplyconfigureanduselog4net

  ///</summary>

  publicclassLoggingExample

  {

    privatestaticreadonlylog4net.ILoglog=log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    

    publicstaticvoidMain(string[]args)

    {

      log.Error("ErrorAcc");

      log.Fatal("FatleAcc");      

      System.Console.ReadLine();

     

    }

  }

}

运行程序,日志就会以xml中定义的四种媒介形式输出。

来自:http://tech.ddvip.com/2008-11/122705683693357_3.html