Log4Net日志记录介绍

原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010

简介

log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
     log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。(f:百度百科)

原理

Log4net
是基于.NET开发的一款记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL 、 ERROR、 WARN、
INFO 、
DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个是不是很熟悉?可以看到和我们平常在调试应用程序的
出错有点类似,在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别在不断的降低。

log4net开源项目结构如图所示:

通过查看源码,log4net主要有5个核心部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,在配置文件中它们以节点的形式出现。

  1. Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;
  2. Appenders:主要负责记录日志介质的方式,它的输出方式主要包括:
    • AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式
    • AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。
    • BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
    • ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
    • ConsoleAppender:将日志输出到控制台。
    • EventLogAppender:将日志写到Windows操作系统的日志中去。
    • FileAppender:将日志写到文件中。
    • ForwardingAppender:用来为一个Appender指定一组约束。
    • MemoryAppender:将日志存到内存缓冲区。
    • NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
    • OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
    • RemotingAppender:通过.NET Remoting将日志写到远程接收端。
    • RollingFileAppender:将日志以回滚文件的形式写到文件中。
    • SmtpAppender:将日志写到邮件中。
    • SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
    • TraceAppender:将日志写到.NET trace 系统。
    • UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

以上有些输出方式可能会经常用到(比如写入文件和数据库的方式),有些可能会不经常用到(邮件方式等),具体我们在下面举例来说明。

3.Layouts:主要负责把记录日志格式化输出,显示得格式主要如下:

        %timestamp [%thread] %-5level %logger{2} %ndc - %message%newline

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

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

  Level:日志的级别。

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

  Message:日志消息。

  newline:换行。

案例一:文件记录方式

首先引用Log4net.dll,然后在添加一个配置文件log4net.config(这里不将配置信息写入web.config,个人觉得写在一起实在太乱)中添加下面的配置信息(注意应和web.config处于相同的位置,即根目录下):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!--日志配置部分-->
  <configSections>
    <!--注册lognet-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net debug="false">
    <root>
      <priority value="ALL"/>
      <appender-ref ref="TraceAppender"/>
      <appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
      </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
      </layout>
    </appender>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Log\SysLog"/>
      <!--日志文件夹及文件名开头-->
      <appendToFile value="true"/>
      <!--是否追加到文件-->
      <RollingStyle value="Date"/>
      <!--日期的格式-->
      <DatePattern value="yyyy-MM-dd"/>
      <!--文件名后面加上.log后缀,必须使用转义字符-->
      <maximumFileSize value="1MB" />
      <!--最大文件大小-->
      <StaticLogFileName value="false"/>
      <!--日志文件名是否为静态-->
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
        <param name="Header" value=" ------------------网站运行过程中产生的错误-------------------------- "/>
        <param name="Footer" value=" -----------------测试:GZQ------------------------------------- "/>
      </layout>
    </appender>
  </log4net>
  <!--End站点日志配置部分-->
</configuration>

%d, %date :表示当然的时间
  %level : 表示日志的级别
  %logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题
  %m, %message :表示日志的具体内容
  %n, %newline: 换行

在AssemblyInfo.cs中添加如下代码:

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

在全局处理程序中添加如下代码:

1         protected void Application_Start(object sender, EventArgs e)
2         {
3             log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
4         }

测试

在页面添加button和一个label,在button的单击事件中添加如下代码:

protected void btnShowTime_Click(object sender, EventArgs e)
        {
            log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            myLogger.Warn("这是一个警告日志");
            myLogger.Info("单击了按钮");
            myLogger.Debug("用Log4Net写入数据库日志");
            myLogger.Error("这是一个错误日志");
            myLogger.Fatal("这是一个致命的错误日志");
            try
            {
                ILog logger = LogManager.GetLogger("LogRecord");
                logger.Debug("用Log4Net写入数据库日志");
                int x = 5;
                int y = 0;
                Response.Write(x / y);
            }
            catch (Exception ex)
            {
                myLogger.Error(ex);
            }
            finally
            {
                lblShow.Text = DateTime.Now.ToLongTimeString()+":操作日志已记录完成";
            }
        }

结果

案例二:日志记入数据库

      记入数据库的方式和记入文件的方式大同小异,主要区别在配置文件,其他步骤相同,记入数据库的配置文件log4net.config如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <!--Log4net Begin-->
  <log4net>
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />
      <commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="3000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>
    <!-- setup the root category, add the appenders and set the default level -->
    <root>
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
      <level value="FINE"/>
      <appender-ref ref="ADONetAppender" />
    </root>
    <!-- specify the level for some specific categories -->
    <logger name="iNotes">
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
      <level value="FINE"/>
      <appender-ref ref="ADONetAppender"/>
    </logger>
    <logger name="StellaLogger">
      <level value="ALL"/>
      <appender-ref ref="AdoNetAppender" />
    </logger>
  </log4net>
  <!--Log4net End-->
</configuration>

创建记录日志的数据表:

CREATE TABLE [dbo].[ErrorLog](   

    [nId] [bigint] IDENTITY(1,1) NOT NULL,   

    [dtDate] [datetime] NOT NULL,   

    [sThread] [varchar](100) NOT NULL,   

    [sLevel] [varchar](200) NOT NULL,   

    [sLogger] [varchar](500) NOT NULL,   

    [sMessage] [varchar](3000) NOT NULL,   

    [sException] [varchar](4000) NULL)

测试
     采用上面的测试方法。

结果

     

结语

     项目中经常用到的两种方式在这里做一下总结。其他方式,用到了再补上。

时间: 2024-10-11 14:15:27

Log4Net日志记录介绍的相关文章

C#Log4net日志记录组件的使用

一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO . DEBUG.ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个可以看到和我们平常在调试应用程序的出错有点类似,在编译器中也会留下如错误.警告之类的提示信息,它们的错误级别不断的降低. 我们接着看Log4net的核心组成部分,Log4net主要由五个部分组成,分

Log4Net日志记录两种方式

本文转载:http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Apache软件基金会Apache Logging Services工程的一部分.Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务.(f:百度百科) 原理 Log4ne

Log4net 日志使用介绍

概述 Log4net 有三个主要组件:loggers,appenders 和 layouts.这三个组件一起工作使得开发者能够根据信息类型和等级(Level)记录信息,以及在运行时控制信息的格式化和信息的写入位置(如控制台,文件,内存,数据库等).过滤器(filter)帮助这些组件,控制追加器(appender)的行为和把对象转换成字符串的对象渲染. 如果对log4net的基本使用并不是很清楚,可以参考我的另一遍介绍:Log4net入门使用 日志(Loggers) 日志请求是通过调用一个日志实例

log4net日志记录

这里是接着上一篇来优化的,上篇:ASP.NET MVC中错误日志信息记录 log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件,数据库,EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题. 1.引用log4net.dll bin\net\2.0\release,不要引用debug版本 2.在Web.Config添加配置 把下面配置信息加到web.config中 Log4Net配置 <configuration> <co

C#- 实用的Log4Net日志记录例子

工作中也是要用到日志记录的,LOG4NET在这块做的不错,以后可以继续拿来用. 1.引用DLL 2.LOG4NET的配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurati

Log4Net日志记录简单使用讲解

一. Log4Net 简介 Log4net 是 Apache 下一个开放源码的项目,我们可以控制日志信息的输出目的地(数据库.控制台.文本文档.文件).Log4net中定义了多种日志信息输出模式. 在做项目的时候令我最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试而且问题很难重新,于是我们需要大量的日志数据来精确的跟踪程序的运行状况. Log4net就可以帮我来解决这一个难题,对于日志的输出我们不需要人为的去干涉,它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看

Log4net日志记录、详细配置(自己使用)

[来自百度百科的一句介绍]log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 1.首先添加对log4net.dll的引用.可以去[http://logging.apache.org/log4net/download_log4net.cgi]下载或者NuGet 2.在web.config(App.config)中进行配置 1 <configuration> 2 <configSe

Log4net 日志记录配置信息

<log4net> 8 <!--配置日志的级别,低于此级别的就不写到日志里面去 9 OFF.FATAL.ERROR, WARN, INFO, DEBUG, ALL 10 --> 11 <root> 12 <level value="DEBUG" /> 13 <appender-ref ref="LogFileAppender" /> 14 <appender-ref ref="Console

使用log4net无法将日志记录插入mysql数据库解决办法

写在前面 今天没事研究了下,将日志文件写入mysql数据库,因为新公司用的数据库也是mysql,项目中需要将日志信息写入数据库,没办法,就研究了下.在使用过程中遇到一个很蛋疼的问题.最后解决了,郁闷了半天.这里做一下记录,以免再犯. 之前写个这方面的文章,关于配置信息,可参考我的这篇文章:Log4Net日志记录两种方式 解决办法 问题就出在我直接将log4net写入数据库的配置文件log4net.config直接复制过来在项目中使用了,当然是修改了连接字符串,提供程序等与mysql相关的配置.配