日志记录组件[Log4net]详细介绍

http://hi.baidu.com/studyaspnet/blog/item/bd7f633e811436fc828b13ab.html

http://www.cnblogs.com/AXzhz/archive/2008/07/25/1251158.html

log4net按照不同的【LEVEL】级别输出到不同文件

http://www.cnblogs.com/mahua/

Log4Net五步走

http://hi.baidu.com/zzticzh/blog/item/6653a0648280aef5f63654f7.html

http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html

 Log4Net主页: http://logging.apache.org/log4net/,下载Log4Net

Log4Net主要由Logger, Appender, Filter, Layout 4个组件构成, 一般情况下后3个组件在配置文件中配置.

1.  LogNet工程引用log4net.dll

2.定义配置文件,可以配置在web.config,也可以单独配置在xml文件里面

3.双击打开AssemblyInfo.cs在最后添加
[assembly: log4net.Config.XMLConfigurator(ConfigFile = “log4net.config”, Watch = true)]


3.创建或获取日志对象
log4net.ILog log = log4net.LogManager.GetLogger(”logger-name”);
可以定义多个log对象,每个log对象分别取配置文件不同的<logger>标记,每个<logger>分别取不同的appender
这样就可以用不同的log对象把日志输出到不同的文件或者其它介质,

4.输出日志信息
  log.debug()

 Log4net主要由五个部分组成,分别为Logger,Appenders, 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和存储过程两种方式。

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

    3、AspNetTraceAppender
        能用asp.net中Trace的方式查看记录的日志。

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

    5、ConsoleAppender
        将日志输出到控制台。

    6、EventLogAppender
        将日志写到Windows Event Log.

    7、FileAppender
        将日志写到文件中。

    8、LocalSyslogAppender
        将日志写到local syslog service (仅用于UNIX环境下).
    9、MemoryAppender
        将日志存到内存缓冲区。

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

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

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

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

    14、SmtpAppender
        将日志写到邮件中。

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

    16、UdpAppender
        将日志connectionless UDP 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等形式输出。


五、Object Renderers


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

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


Logger

负责产生日志消息,可以在代码中调用

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


Appender

负责向存储介质中追加日志, 一般在配置文件中配置,根据保存日志介质的不同Appender有多种,
比如:AdoNetAppender,EventLogAppender,RollingFileAppender等.参见:
http://logging.apache.org/log4net/release/config-examples.HTML.

Filter

负责过滤日志, 一般和Appender联合使用,在配置文件中配置

Layout

负责日志消息的格式, 一般和Appender联合使用,在配置文件中配置。

----------------------------------------------------------------------

log4net标签的框架如下, 该标签下有root, logger, appender等标签

root标签

所有的logger都从root继承, root本身也是一个logger

logger标签

每个logger标签代表一个logger,appender-ref表示该logger产生的日志消息传递给哪个appender,一个logger可以把相同的消

息传递给多个appender记录

appender标签

每个appender表示一个日志的存储位置,name不能和type一样

设定参数

 日志根据日期滚动

 日志文件名格式为

 日志文件名是否是固定不变的


layout type="log4net.Layout.PatternLayout"

日志消息的格式, 表示换行

param name=”ConversionPattern” value=”%d [%t] %-5p %c - %m%n”
param name=”Header” value=” ———————-header————————– ”
param name=”Footer” value=” ———————-footer————————– ”

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息

%n(new line):换行

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

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

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

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等

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

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

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

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

-------------------------------------------------------------------------------------------------------------------------------------

log4net>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑  <logger name="loggerAX">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--如果没有定义LEVEL的值,则缺省为DEBUG-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <level value="ALL" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appender-ref ref="SmtpAppenderAX"></appender-ref>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appender-ref ref="FileAppenderAX"></appender-ref>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑  </logger>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑  <appender name="SmtpAppenderAX" type="log4net.Appender.SmtpAppender">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <to value="AXzhz@163.com"></to>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <from value="AXzhz@163.com" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <subject value="AX'Test Log Message" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <smtpHost value="smtp.163.com" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <username value="AXzhz" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <password value="110" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <bufferSize value="2048" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--超长部分是否丢弃-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <lossy value="false" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--evaluator时好时坏,靠不住,还是用filter实在-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--<evaluator type="log4net.Core.LevelEvaluator">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <threshold value="ERROR"/>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </evaluator>-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--<evaluator type="log4net.Core.LevelEvaluator,log4net">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <threshold value="WARN" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </evaluator>-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--将导致不能写日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--<filter type="log4net.Filter.DenyAllFilter" />-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--输出级别在WARN和OFF之间的日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <filter type="log4net.Filter.LevelRangeFilter">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelMin" value="WARN" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelMax" value="OFF" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </filter>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <layout type="log4net.Layout.PatternLayout">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] : %newline%message%newline" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </layout>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑  </appender>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑  <appender name="FileAppenderAX" type="log4net.Appender.RollingFileAppender">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--绝对路径-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <file value="D:\\AX.txt"></file>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--相对路径,在项目的根目录下-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--以最后一个路径为准,所以上面的绝对路径下不会写日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <file value="./Log/AX.txt"></file>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--防止多线程时不能写Log,官方说线程非安全-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--实际使用时,本地测试正常,部署后有不能写日志的情况-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appendToFile value="true" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--可以为:Once|Size|Date|Composite-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--Composite为Size和Date的组合-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <rollingStyle value="composite" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--日志最大个数,都是最新的-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--rollingStyle节点为Date时,该节点不起作用-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--rollingStyle节点为Size时,只能有value个日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--rollingStyle节点为Composite时,每天有value个日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <maxSizeRollBackups value="10" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--当备份文件时,为文件名加的后缀-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--后缀为*.txt时,例:AX.txt_2008-07-24.PxP  应该是程序上的一个bug-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--后缀为*.TXT时,例:AX.txt_2008-07-25.TXT-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <datePattern value="_yyyy-MM-dd.TXT" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--可用的单位:KB|MB|GB-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--不要使用小数,否则会一直写入当前日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <maximumFileSize value="1KB" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--置为true,当前最新日志文件名永远为file节中的名字-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <staticLogFileName value="true" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--输出级别在INFO和ERROR之间的日志-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <filter type="log4net.Filter.LevelRangeFilter">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelMin" value="INFO" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelMax" value="ERROR" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </filter>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <filter type="log4net.Filter.LevelMatchFilter">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelToMatch" value="WARN" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </filter>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <filter type="log4net.Filter.DenyAllFilter" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <layout type="log4net.Layout.PatternLayout">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </layout>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑  </appender>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑</log4net>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--==================================layout节点的配置说明==================================-->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--                                                                        Made By AX      -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息                          -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %n(new line):换行                                                                   -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %d(datetime):输出当前语句运行的时刻                                                 -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数                           -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %t(thread id):当前语句所在的线程ID                                                  -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等                           -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %c(class):当前日志对象的名称,例如:                                                -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--               模式字符串为:%-10c -%m%n                                                    -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--               代码为:                                                                     -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        ILog log=LogManager.GetLogger(“Exam.Log”);                                        -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        log.Debug(“Hello”);                                                               -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--            则输出为下面的形式:                                                            -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        Exam.Log       - Hello                                                              -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %L:输出语句所在的行号                                                              -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %F:输出语句所在的文件名                                                            -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        %-数字:表示该项的最小长度,如果不够,则用空格填充                                  -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出: -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--        176 [main] INFO  org.foo.Bar - Located nearest gas station.                         -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--                                                                                        -->

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<!--========================================================================================-->

 

Ⅲ.在Default.aspx.cs的Page_Load里添加如下代码.

 

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    protected void Page_Load(object sender, EventArgs e)

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑     日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑{

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑        //下面两句应该放在网站刚刚启动时加载,并放在一个静态方法里方便调用

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑        log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("Log4Net_AX.config")));

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑        ILog logAX = LogManager.GetLogger("loggerAX");

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑        //写日志

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑        logAX.Error("Error AX");

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑        logAX.Info("Info AX");

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    }

 

F5,在项目目录下找到Log文件夹的AX.txt ,这个就是刚刚生成的日志文件.

 

【写日志的原则】

Ⅰ.在catch后,把异常写入日志.

Ⅱ.在调用第三方控件的开始和结束处.

Ⅲ.在连接数据库的开始结束处.

Ⅳ.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.

Ⅴ.在自己认为很重要的逻辑处写入日志.

 

【注意】

发现有重要问题时最好用邮件日志,但不要指望上面的邮件配置节能发日志.

要使用能用的smtp服务器,163的只有部分用户能

用.我的就不能用,很是郁闷.

要合理配置下列参数.

Ⅰ.日志文件的大小

Ⅱ.备份的日志名样式,最好时间精确到分---------------------------------------------------------------------------------------------------------------------------------------

因为工作中有要用到Log记录,找到一篇不错的文章,就转了过来。

一 Log4net简介

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

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

二 Log4net核心组成

Log4net主要由五个部分组成,分别为Logger,Appenders, 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和存储过程两种方式。

2 AnsiColorTerminalAppender

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

3 AspNetTraceAppender

     能用asp.net中Trace的方式查看记录的日志。

4 BufferingForwardingAppender

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

5 ConsoleAppender

     将日志输出到控制台。

6 EventLogAppender

     将日志写到Windows Event Log.

7 FileAppender

     将日志写到文件中。

8 LocalSyslogAppender

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

9 MemoryAppender

     将日志存到内存缓冲区。

10 NetSendAppender

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

11 RemoteSyslogAppender

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

12 RemotingAppender

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

13 RollingFileAppender

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

14 SmtpAppender

     将日志写到邮件中。

15 TraceAppender

     将日志写到.NET trace 系统。

16 UdpAppender

     将日志connectionless UDP 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等形式输出。

五)Object Renderers

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

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

三 如何在项目中使用log4net

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

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

一)主要代码:

1. 配置文件app.config

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

2<configuration>

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

4     <configSections>

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

6     </configSections>

7     <appSettings>

8         <!-- To enable internal log4net logging specify the following appSettings key -->

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

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

11     <log4net>

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

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

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

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

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

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

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

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

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

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

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

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

24                 <!--输出格式-->

25                 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />

26             </layout>           

27         </appender>

28         <!--定义输出到控制台命令行中-->

29         <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">           

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

31                 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

32             </layout>

33         </appender>

34         <!--定义输出到windows事件中-->

35         <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">

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

37                 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

38             </layout>

39         </appender>

40         <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为D盘的access.mdb-->

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

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

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

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

45             <parameter>

46                 <parameterName value="@log_date" />

47                 <dbType value="String" />

48                 <size value="255" />

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

50                     <conversionPattern value="%date" />

51                 </layout>

52             </parameter>

53             <parameter>

54                 <parameterName value="@thread" />

55                 <dbType value="String" />

56                 <size value="255" />

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

58                     <conversionPattern value="%thread" />

59                 </layout>

60             </parameter>

61             <parameter>

62                 <parameterName value="@log_level" />

63                 <dbType value="String" />

64                 <size value="50" />

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

66                     <conversionPattern value="%level" />

67                 </layout>

68             </parameter>

69             <parameter>

70                 <parameterName value="@logger" />

71                 <dbType value="String" />

72                 <size value="255" />

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

74                     <conversionPattern value="%logger" />

75                 </layout>

76             </parameter>

77             <parameter>

78                 <parameterName value="@message" />

79                 <dbType value="String" />

80                 <size value="1024" />

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

82                     <conversionPattern value="%message" />

83                 </layout>

84             </parameter>

85         </appender>

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

87         <root>

88             <appender-ref ref="LogFileAppender" />

89             <appender-ref ref="ConsoleAppender" />

90             <appender-ref ref="EventLogAppender" />

91             <appender-ref ref="AdoNetAppender_Access" />

92         </root>

93     </log4net>

94</configuration>

2. LoggingExample.cs

1// Configure log4net using the .config file

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

3// This will cause log4net to look for a configuration file

4// called ConsoleApp.exe.config in the application base

5// directory (i.e. the directory containing ConsoleApp.exe)

6

7namespace ConsoleApp

8{

9     using System;

10

11     /**//// <summary>

12     /// Example of how to simply configure and use log4net

13     /// </summary>

14     public class LoggingExample

15     {

16         private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

17       

18         public static void Main(string[] args)

19         {

20             log.Error("Error Acc");

21             log.Fatal("Fatle Acc");           

22             System.Console.ReadLine();

23           

24         }

25

26     }

27}

28

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

 

场景:我想用log4net输出两个log文件,一个文件输出所有的log,例如debug,info,warn,error,fatal全部输出,

另外一个log文件只输出error级别的log。

困扰了一段时间,开始还以为没有这样的功能,仔细看log4.net的文档发现是可以的。

其他地方省略了,重点看红色标出部分。这样的话同一个地方写入LOG,就会根据不同的级别输出到不同的文件中。

 下面是配置文件

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<log4net>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<root>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <level value="DEBUG" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appender-ref ref="RollingFileAppender" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appender-ref ref="ErrorRollingFileAppender"/>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑</root>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <file value="c:\log.txt" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appendToFile value="true" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <rollingStyle value="Size" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <maxSizeRollBackups value="10" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <maximumFileSize value="100KB" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <staticLogFileName value="true" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <layout type="log4net.Layout.PatternLayout">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <conversionPattern value="%date [%thread] %-5level [%rms used] - %message%newline" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </layout>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑</appender>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑<appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender" LEVEL="ERROR">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <file value="c:\errorlog.txt" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <appendToFile value="true" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <rollingStyle value="Size" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <maxSizeRollBackups value="10" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <maximumFileSize value="1024KB" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <staticLogFileName value="true" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <layout type="log4net.Layout.PatternLayout">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <conversionPattern value="%date [%thread] %-5level [%logger] [%property{NDC}] - %message%newline" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </layout>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    <filter type="log4net.Filter.LevelRangeFilter">

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelMin" value="ERROR" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑      <param name="LevelMax" value="ERROR" />

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑    </filter>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑</appender>

 日志记录组件[Log4net]详细介绍  - yorkguo - 人生绚丽 知者不惑</log4net>

转:http://yorkguo.blog.163.com/blog/static/9164249420092721834209/
原文地址:https://www.cnblogs.com/94cool/p/1529553.html