Log4net使用详解

一、log4net介绍

  log4net.Net下一个开源的日志记录组件,其功能非常强大,可以将日志分为不同的等级,以不同的格式,输出到不同的媒介。

二、log4net的组成部分

1.  Appenders

  Appenders用来定义日志的输出方式,即日志要写到哪种介质上去。Appenders必须实现log4net.Appenders.Iappender接口。

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

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

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

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

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

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

  ConsoleAppender将日志输出到控制台。

  EventLogAppender将日志写到Windows Event Log

  FileAppender将日志写到文件中。

  LocalSyslogAppender将日志写到local syslog service(仅用于UNIX环境下)。

  MemoryAppender将日志存到内存缓冲区。

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

  RemoteSyslogAppender通过UDP网络协议将日志写到Remote syslog service

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

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

  SmtpAppender将日志写到邮件中。

  TraceAppender将日志写到.NET trace 系统。

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

2. Filters

  使用过滤器可以过滤掉Appender输出的内容。过滤器通常有以下几种:

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

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

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

  LoggerMatchFilterLogger名称匹配才记录

  PropertyFilter消息匹配指定的属性值时才被记录

  StringMatchFilter消息匹配指定的字符串才被记录

3. Layouts

  Layout用于控制Appender的输出格式,可以是线性的,也可以是XML。一个Appender只能有一个Layout。最常用的LayoutPatternLayout,其次是SimpleLayoutRawTimeStampLayoutExceptionLayout

4. Loggers

  Logger是直接和应用程序交互的组件,它产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。Logger提供了多种方式来记录一个日志消息,可以有多个Logger同时存在。所有的Logger都从Root继承,Root本身也是一个Logger

  日志的等级由高到低分别为:OFF>FATAL>ERROR>WARN>INFO>DEBUG>ALL其中:

  FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。

  ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。

  WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。

  INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。

  DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。

  高于等级设定值的方法都能写入日志, Off所有的写入方法都不写到日志里,ALL则相反。例如当我们设成Info时,logger.Debug就会被忽略而不写入文件,但是FATAL, ERROR,WARN,INFO会被写入,因为他们等级高于INFO

5. Object Renders

  它告诉logger如何把一个对象转化为一个字符串记录到日志里。

6. Repository

  Repository主要用于日志对象组织结构的维护。

三、配置文件详解

  所有的配置都要在<log4net>元素里定义。

1. <log4net>节点说明

  支持的属性:

  Debug:可选,取值是truefalse,默认是false。设置为true,开启log4net的内部调试。

  Update:可选,取值是MergeOverwrite,默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。

  Threshold:可选,取值是repository中注册的level,默认值是ALL

  支持的子元素:

  <root>

    实际上就是一个根logger,所有其它的logger都默认继承它,如果配置文件里没有显式定义,则框架使用根日志中定义的属性。root元素没有属性,它支持的子元素为:

level

最多一个,只有在这个级别或之上的事件才会被记录。

appender-ref

0个或多个,要引用的appender的名字。

param

0个或多个,设置一些参数。

   <logger>

    支持的属性:

name

必须的,logger的名称。

additivity

可选,取值是truefalse,默认值是true。设置为false时将阻止父logger中的appender

    支持的子元素:

level

最多一个,只有在这个级别或之上的事件才会被记录。

appender-ref

0个或多个,要引用的appender的名字。

param

0个或多个,设置一些参数。

  <appender>

    定义日志的输出方式,只能作为log4net的子元素。它支持的属性为:

name

必须的,且唯一,Appender对象的名称。

type

必须的,Appender对象的输出类型。

    支持的子元素:

appender-ref

0个或多个,允许此appender引用其他appender

filter

0个或多个,定义appender使用的过滤器。

layout

最多一个,定义appender使用的输出格式。

param

0个或多个,设置appender属性的值。

2. <appender>节点举例说明

  

  layout就是布局,layout中的ConversionPattern属性用来设置日志文件的格式。常用的格式介绍如下:

  %m(message)输出的日志消息

  %n(new line):换行

  %d(datetime):输出当前语句运行的时刻

  %r(run time):输出程序从运行到执行当前语句时消耗的毫秒数

  %t(thread id):当前语句所在的线程ID

  %p(priority)日志的当前优先级别,即DebugInfoWarn

  %c(class):当前日志对象的名称

  %L:输出语句所在的行号

  %F:输出语句所在的文件名

  %-数字:表示该项的最小长度,如果不够,则用空格填充

3.将日志写入SQL数据库

  ① 在数据库中创建一张表   

    CREATE TABLE [Log]

    (

      [ID] int IDENTITY (1, 1) primary key,

      [Date] datetime NOT NULL ,

      [Thread] varchar(100) NOT NULL ,

      [Level] varchar(100) NOT NULL ,

      [Logger] varchar(200) NOT NULL ,

      [Message] text NULL ,

      [Exception] text NULL

    )

  ② 配置<appender>节点

     <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">

      <!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->

      <param name="BufferSize" value="10" />

      <!--引用-->

      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <!--连接数据库字符串-->

      <connectionString value="data source=.;initial catalog=Test;integrated security=True;persist security info=True;" />

      <!--插入到表Log-->

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

      <!--日志记录时间,RawTimeStampLayout为默认的时间输出格式-->

      <parameter>

         <parameterName value="@log_date"/>

         <dbType value="DateTime"/>

         <layout type="log4net.Layout.RawTimeStampLayout"/>

      </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="4000"/>

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

            <conversionPattern value="%message"/>

         </layout>

      </parameter>

      <!--异常信息。ExceptionLayout 为异常输出的默认格式-->

      <parameter>

         <parameterName value="@exception"/>

         <dbType value="String"/>

         <size value="2000"/>

         <layout type="log4net.Layout.ExceptionLayout"/>

      </parameter>

    </appender>

四、log4net的使用

 1.  引入log4net组件

  添加log4net组件,可以到官网上下载,地址是:http://logging.apache.org/log4net/,也可以通过VS自带的NuGet包管理工具进行引用。这里,我们通过程序包管理控制台输入命令来安装组件:

VS上依次选择“工具”-->NuGet程序包管理器”-->“程序包管理控制台”,输入命令:Install-Package log4net,按回车即可。

2. 添加配置文件

 有两种方式可以配置log4net,一是在config文件中配置log4net二是创建一个独立的log4net.config文件。

 ① config文件中配置

  首先要在web.config或者app.config文件的<configSections>节点中增加配置节点,如下:

  <configSections>

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

  </configSections>

  其次,可添加<log4net>节点进行配置。

 ② 使用log4net.config文件

  首先,创建一个xml文件并命名为log4net.config,其次,添加<log4net>节点进行配置。

3. 初始化log4net配置

  应用程序启动时,需要加载log4net配置文件,此时,应在AssemblyInfo.cs文件中添加一句话:

  [assembly:log4net.Config.XmlConfiguratior(ConfigFileExtension=”config”,Watch=true)]

  如果使用自定义的log4net.config配置文件,应指定配置文件的名字:

  [assembly:log4net.Config.XmlConfiguratior(ConfigFile=”log4net.config”,ConfigFileExtension=”config”,Watch=true)]

4.  调用代码

  Log4net.Ilog _log=log4net.LogManager.GetLogger(“record.log”);

  _log.Info(“程序正常运行中”);

posted on 2021-05-06 21:15  码匠坊  阅读(87)  评论(0编辑  收藏  举报

导航