一、作用                            

提供一个记录日志的框架,可以将日志信息记录到文件、控制台、Windows事件日志和数据库(MSSQL、Acess、Oracle、DB2和SQLite等)。

二、先看看示例,感受一下吧                    

config配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
<!-- 定义日志的输出媒介 -->
<root>
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="R"/>
</root>
<!-- 定义输出到控制台 -->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<!-- 定义输出到日志文件 -->
<appender name="R" type="log4net.Appender.FileAppender" rollingStyle="Date" datePattern="yyyyMMdd-HH:mm:ss">
<file value="logs/log.txt"></file>
<appendToFile value="true"></appendToFile>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-d{yyyy-MM-dd HH\:mm\:ss} [%L] [%c]-[%p] %m%n"></conversionPattern>
</layout>
</appender>
</log4net>
</configuration>

cs文件

/**
* 指定log4net使用.config文件来读取配置信息
* 若为Winform(假定程序为Demo.exe), 那么配置文件则为Demo.exe.config
* 若为Webform,则为web.config
*/
[assembly:log4net.Config.XmlConfigurator(Watch=true)]
namespace Demo{
public class MainClass{
public static void Main(String[] args){
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log.Error("error", new Exception("there is an exception"));
log.Fatal("fatal", new Exception("there is a deadly exception occurs"));
log.Info("info");
log.Debug("debug");
log.Warn("warn");
Console.Read();
}
}
}

三、框架的核心组件                         

 1. Appender

  作用:用于定义日志信息的输出介质(文件、控制台、Windows事件日志和数据库(MSSQL、Acess、Oracle、DB2和SQLite等))
  内置的Appdner组件:

     ConsoleAppender ,输出介质为控制台

     FileAppender     ,输出介质为文件,示例如下

<appender name="FileAppender" type="log4net.Appender.FileAppender"
file="logs/log.txt" appendToFile="true">
<layout type="log4net.Layout.PatternLayout">
..........
</layout>
</appender>

RollingFileAppender ,将日志以回滚文件的形式写入文件中。可以指定文件最大容量,当超过就生成一个新文件来记录,且可以指定最多生成日志文件数量,当超过时则覆盖从第一个日志文件开始循环覆盖。

示例1:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"
file="logs/log.txt" appendToFile="true" rollingStyle="Size" maxSizeRollBackups="" maximumFileSize="100KB" staticLogFileName="true">
<layout type="log4net.Layout.PatternLayout">
..........
</layout>
</appender>

示例2:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"
file="logs/log.txt" appendToFile="true" rollingStyle="Date" datePattern="yyyyMMdd">
<layout type="log4net.Layout.PatternLayout">
..........
</layout>
</appender>

EventLogAppender ,输出介质为系统日志

AdoNetAppender    ,输出介质为数据库,示例如下

<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient" />
<connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" />
<commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />
<bufferSize value="" />
<parameter>
<parameterName value=":log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value=":thread" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value=":log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value=":logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value=":message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>

自定义Appender时,需要继承 log4net.Appender.AppenderSkeleton

2. Layout

作用:定义向用户显示最终的经格式化的输出信息。
     注意:一个Appender对象仅能对应一个Layout对象
     内容的Layout组件:

     PatternLayout ,用户自定义格式,内置参数如下

%m(message),输出的日志消息
%n(newline),换行
%d(datetime),输出当前语句运行的时刻
%r(runtime),输出程序从运行到当前语句时消耗的毫秒数
%t(thread id),输出当前语句运行的线程ID
%p(level),输出日志级别(日志事件)
%c(class),输出当前语句所在的对象名称
%M(method),输出当前语句所在的方法名称
%f(file),输出当前语句所在的文件名称
%L(line),输出当前语句位于所在的文件中的行号
%l(location),输出当前语句位于的全限定类名,以及源文件和行号
%数字,表示该项的最小长度,如果不够则在左边用空格填充。如:%5p,表示输出日志级别,且长度最小为5个字符
%-数字,表示该项的最小长度,如果不够则在右边用空格填充。如:%-5p,表示输出日志级别,且长度最小为5个字符
%.数字,表示该项的最大长度,如果超出则截断
%数字.数字,表示该项的必须位于最小和最大长度之间,如果超出则截断, 不够则用空格填充

最佳实践: %-d{yyyy-MM-dd HH\:mm\:ss} [%L] [%c]-[%p] %m%n

SimpleLayout

ExceptionLayout ,输出时包含Message和Trace信息。Logger方法必须传入Exception对象,否则什么都不输出。
XmlLayout,中文会有问题。

自定义Layout时,需要继承 log4net.Layout.LayoutSkeleton

3. Appender Filter

  作用:默认情况下Appender对象会将所有日志信息都输出到相应的介质中,通过Appender Filter对象(命令空间:log4net.Filter)可以按照不同的标准过滤日志事件或内容。
  内置的Filter组件:

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

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

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

LoggerMatchFilter , Logger名称匹配才被记录

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

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

4. Logger

作用:直接与应用交互的组件,用于触发日志事件

级别(日志事件) 优先级
OFF 6
FATAL 5
ERROR 4
WARN 3
INFO 2
DEBUG 1
ALL  0

  5. Object Render

作用:输出根据Layout格式化的日志消息。Render必须实现log4net.ObjectRender.IObjectRender接口

  6. Repository

作用:负责日志对象组织结构的维护。对于非框架扩展者,几乎不会用到该组件。

四、配置方式                           

1. 代码中配置
   
通过 log4net.Config.BasicConfigurator.Configure 配置根日志且只能配置根日志而已。
   
示例 :

// 和PatternLayout一起使用FileAppender

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.FileAppender(

     new log4net.Layout.PatternLayout("%d

       [%t]%-5p %c [%x] - %m%n"),"testfile.log"));

// using a FileAppender with an XMLLayout

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.FileAppender(

    new log4net.Layout.XMLLayout(),"testfile.xml"));

// using a ConsoleAppender with a PatternLayout

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.ConsoleAppender(

    new log4net.Layout.PatternLayout("%d [%t] %-5p %c - %m%n")));

// using a ConsoleAppender with a SimpleLayout

log4net.Config.BasicConfigurator.Configure(

  new log4net.Appender.ConsoleAppender(new

    log4net.Layout.SimpleLayout()));

  2. 配置文件(推荐使用)

log4net框架会在 AppDomain.CurrentDomain.BaseDirectory 指向的目录路径下查找配置文件。

在config文件中配置
            在<configuration>节点下添加<configSections>节点

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

只有添加上述节点,log4net.dll才能读取config文件下<log4net>节点下配置信息

     根日志<root>节点
            框架中所有日志对象都是根日志的后代,因此日志对象若没有显式配置时则会使用根日志的配置信息。

<root>
<!-- level节点用于定义处理哪个级别的日志事件,缺省值为DEBUG -->
<level>INFO</level>
<!-- appender-ref节点用于定义日志对象所使用的Appender对象 -->
<appender-ref ref="appender节点的name属性值"/>
</root>

    日志对象<logger>节点

      显式配置日志对象。

<!-- additivity特性设置为false时,日志对象将不继承根日志的appender-ref节点信息。缺省值为true -->
<logger name="test.Logging" additivity="false">
<!-- 覆盖根日志的level设置 -->
<level value="WARN"/>
</logger>

.cs文件中的相应的调用方式

log4net.LogManager.GetLogger("test.Logging");

   Appender对象<appender>节点

<appender name="appender1" type="log4net.Appender.FileAppender">
<layout type="log4net.Laytout.PatternLayout">
<conversionPattern value=".........."/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter" levelMin="DEBUG" levelMax="WARN">
</filter>
</appender>

五、关联配置文件                           

每个可独立执行的程序集均可以关联自己的配置文件。(组件库就使用调用者的配置文件好了)
  
在 AssemblyInfo.cs文件 中添加

[assembly:log4net.Config.DOMConfigurator([ConfigFile="配置文件名"|ConfigFileExtension="编译后配置文件的扩展名"][Watch=true/false])

参数说明:

ConfigFile :指定配置文件含扩展名的路径,如果为相对路径则以AppDomain.CurrentDomain.BaseDirectory为当前路径;
 ConfigFileExtension :若程序编译后配置文件使用了不同的扩展名,则通过该属性指定,默认值为config,配置文件的最终名称为"应用程序名.exe.config";
                                          注意:ConfigFile和ConfigFileExtension属性是互斥的,仅能设置其中一个
 Watch :设置是否需要运行时监视文件的修改、重命名和删除等事件,若设置为true,则使用FileSystemWatcher来监视配置文件。

六、输出日志的优化方式                          

/**
* 由于触发日志事件时,会检查日志对象的级别是否满足日志事件的级别
* 先检测日志对象的级别,才触发日志事件
*/
if (log.IsDebugEnabled) log.Debug("message.....");

七、总结                                

现在我们就不再糊里糊涂地调用log4net了,建议具体使用时再查阅API文档!

尊重原创,转载请注明来自: http://www.cnblogs.com/fsjohnhuang/p/3991218.html  ^_^肥仔John

八、参考                                

http://www.cnblogs.com/jams742003/archive/2009/12/10/1620861.html
http://zhoufoxcn.blog.51cto.com/792419/429988

.Net魔法堂:log4net详解的更多相关文章

  1. log4net详解(转载)

    1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...

  2. .Net魔法堂:AssemblyInfo.cs文件详解

    一.前言 .net工程的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作该文件.那就是通过在鼠标右键点 ...

  3. AssemblyInfo.cs文件详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq395537505/article/details/49661555 一.前言 .net工程的Pr ...

  4. JS魔法堂:LINK元素深入详解

    一.前言 我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css&quo ...

  5. 【转】Java魔法堂:String.format详解

    Java魔法堂:String.format详解     目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六. ...

  6. MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

    一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解   其属性如下: parameterType  ...

  7. JS魔法堂:IMG元素加载行为详解

    一.前言 在<JS魔法堂:jsDeferred源码剖析>中我们了解到img元素加载失败可以作为函数异步执行的优化方案,本文打算对img元素的加载行为进行更深入的探讨. 二.资源加载的相关属 ...

  8. MyBatis魔法堂:ResultMap详解

    一.前言   MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了, ...

  9. CSS魔法堂:Position定位详解

    一.Position各属性值详解   1.  static :默认值,元素将按照正常文档流规则排列.   2.  relative :相对定位,元素仍然处于正常文档流当中,但可以通过left.top. ...

随机推荐

  1. 努力学习 HTML5 (2)—— 元素的增和删

    HTML5 放松了某些规则,HTML5 的制定者想让这门语言更紧密地反映浏览器的现实. 放松的规则 不要求包含 <html>.<head> 和 <body> 元素. ...

  2. mysql 修改root登录密码

    mysql -u root -p 然后回车,进入(等于用空密码进入) 2 use mysql; update user set password=password('123456') where us ...

  3. IPv6正则表达式

    斯蒂芬·瑞恩写了一个非常有用的正则表达式,可用于匹配任何一个合法的IPv6地址.以下为正则表达式的代码: ^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|: ...

  4. 可扩展验证框架 - A2DFramework验证框架使用介绍

    SUMMARY 用途 DEMO演示 NuGet相关的资料 VS工具端的设置 用途 数据验证的作用很重要,目前.NET提供的内建验证机制是采用DataAnnotation方式来实现属性的验证,并且也提供 ...

  5. [界面开发新秀]AYUI开发360领航版系列教程-AyWindow接入[1/40]

    开发包DLL下载地址:请加入 466717219群,自己下载(已经发布ayui3.7,在群里,为了不让你作为收藏工具,也只有入群才能下载,喜欢你就进.不喜欢你还是不要来了) AYUI初衷:简单化商业软 ...

  6. 用ASP.NET Core 1.0中实现邮件发送功能-阿里云邮件推送篇

    在上篇中用MailKit实现了Asp.net core 邮件发送功能,但一直未解决阿里云邮件推送问题,提交工单一开始的回复不尽如人意,比如您的网络问题,您的用户名密码不正确等,但继续沟通下阿里云客户还 ...

  7. 自己写的一个Yeoman的Generator-Require-Angularjs

    Yeoman是一个常见的工作流,能够很方面的搭建属于自己的脚手架. 这段时间我用闲暇时间写了一个Generator来玩了一下,这个Generator的主要目的是快速建立一个RequireJS+Angu ...

  8. 用户管理 之 Linux 用户管理工具介绍

    Linux是一个多用户的操作系统,她有完美的用户管理工具,这些工具包括用户的查询.添加.修改,以及用户之间相互切换的工具等:通过这些工具,我们能安全.轻松的完成用户管理: 在这里我们要引入用户控制工具 ...

  9. 实现打印级别且带图片的Excel 方案

    导出二维数据excel,其实很简单,使用cvs就可以了.但是如果导出格式复杂带样式还带图片的怎么办?客户的要求有时就是这么变态.呵呵.如果使用.net,微软提供的有库,使用php好像也有现成的有库.我 ...

  10. Oracle 一次生产分库,升级,迁移

    今天完成了一个负载较高的中央数据库的分库操作, 并实现了oracle的滚动升级(10.2.0.1->10.2.0.4), 业务中断仅15分钟. 平台: RHEL AS 4 + Oracle 10 ...