C#--Log4Net日志

你离开我真会死。 提交于 2020-01-13 02:01:57

Log4Net日志

Log4Net简介

Log4net是Apache下一个开放源码的项目,可以控制日志信息的输出目的地(数据库、控制台、文本文档、文件)Log4net中定义了多种日志信息输出模式。

为什么要使用Log4Net

在做项目的时候令我最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试而且问题很难分析,于是我们需要大量的日志数据来精确的跟踪程序的运行状况。

Log4net就可以帮我来解决这一个难题,对于日志的输出我们不需要人为的去干涉,它可以根据需要将日志输出到控制台,文本文件,windows日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug。

Log4Net的使用

首先引用Log4Net.dll

使用Log4net必须引入log4net.dll 文件,因为log4net是开源的,所以可以直接将源码添加到工程项目中去。然后生成新的dll文件。

初始化注册Log4net

在程序启动的时候就初始化配置信息log4net.Config.XmlConfigurator.Configure();

在BS程序中,在根目录的Global.asax文件的Application_Start方法中添加:log4net.Config.XmlConfigurator.Configure();

在CS程序中在根目录的Program.cs中的Main方法中添加:log4net.Config.XmlConfigurator.Configure();

无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:

[assembly: log4net.Config .XmlConfigurator()]

配置web.config/App.config

下面使用配置一个最简单的文件输出。

Log4Net的配置文件,此段内容添加到App.config或者web.config文件中:

<configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="D:\a.txt"></file>
        <appendToFile value="true"></appendToFile>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="[%d]:%n%m%n"></conversionPattern>
        </layout>
    </appender>
    <!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%d]:%n%m%n"></conversionPattern>
    </layout>
    </appender>-->
    <root>
          <level value="INFO"></level>
          <appender-ref ref="FileAppender"></appender-ref>
          <!--<appender-ref ref="ConsoleAppender"></appender-ref>-->
    </root>
    <logger name="MyLogger">
            <!--<level value="ERROR"></level>-->
            <!--<appender-ref ref="FileAppender"></appender-ref>-->
            <!--<appender-ref ref="ConsoleAppender"></appender-ref>-->
    </logger>
</log4net>

Log4Net结构

Log4net 主要分为5个核心组件: Logger, Appender, Filter, Layout, Object Render。

Logger

主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。

支持的属性

name 必须的,logger的名称
additivity 可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。

支持的子元素

appender-ref 0个或多个,要引用的appender的名字
level 最多一个。 只有在这个级别或之上的事件才会被记录。
param 0个或多个, 设置一些参数。

Logger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。

Logger提供了多种方式来记录一个日志消息,也可以有多个Logger同时存在。每个实例化的Logger对象对被log4net作为命名实体(Named Entity)来维护。log4net使用继承体系,也就是说假如存在两个Logger,名字分别为abc和ab。那么ab就是abc的祖先。每个Logger都继承了它祖先的属性。所有的Logger都从Root继承,Root本身也是一个Logger。

日志的等级,它们由高到底分别为:

OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL

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

在具体写日志时,一般可以这样理解日志等级:

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

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

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

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

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

Logger实现的ILog接口,ILog定义了5个方法(Debug,Inof,Warn,Error,Fatal)分别对不同的日志等级记录日志。这5个方法还有5个重载。以Debug为例说明一下,其它的和它差不多。

ILog中对Debug方法的定义如下:

void Debug(object message);

void Debug(object message, Exception ex);

还有一个布尔属性:

bool IsDebugEnabled { get; }

如果使用Debug(object message, Exception ex),则无论Layout中是否定义了%exception,默认配置下日志都会输出Exception。包括Exception的Message和Trace。如果使用Debug(object message),则日志是不会输出Exception。

最后还要说一个LogManager类,它用来管理所有的Logger。它的GetLogger静态方法,可以获得配置文件中相应的Logger:

log4net.ILog log = log4net.LogManager.GetLogger(“logger-name”);

Appender

简单称之为“附着器”。意思就是说日志的输出必须依赖于它,更确切的说以文本形式输出,还是控制台格式输出都必须要依靠它来控制。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. MemoryAppender 将日志存到内存缓冲区。
  9. NetSendAppender 将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
  10. RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。
  11. RemotingAppender 通过.NET Remoting将日志写到远程接收端。
  12. RollingFileAppender 将日志以回滚文件的形式写到文件中。
  13. SmtpAppender 将日志写到邮件中。
  14. TraceAppender 将日志写到.NET trace 系统。
  15. UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
<appender>

name属性必须唯一,type属性必须指定。

name 必须的,Appender对象的名称
type 必须的,Appender对象的输出类型

支持的子元素

appender-ref 0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。
filter 0个或多个,定义此app使用的过滤器。
layout 最多一个。定义appender使用的输出格式。
param 0个或多个, 设置Appender类中对应的属性的值。
File value属性指定文件的存放位置

root

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

支持的子元素:

appender-ref 0个或多个,要引用的appender的名字。
level 最多一个。 只有在这个级别或之上的事件才会被记录。
param 0个或多个, 设置一些参数

layout

布局,只能作为appender的子元素。

支持的属性

type:必须的,Layout的类型

支持的子元素

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

filter

过滤器,只能作为appender的子元素。

支持的属性

type:必须的,Filter的类型

支持的子元素

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

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

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

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

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

LoggerMatchFilter 与Logger名称匹配,才记录

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

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

param

param元素可以是任何元素的子元素。

支持的属性

name 必须的,取值是父对象的参数名。
value 可选的,value和type中,必须有一个属性被指定。value是一个能被转化为参数值的字符串。
type 可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。

支持的子元素

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

Log4Net参数说明

%m[%message] : 输出的日志消息
%n : 换行
%d[%datetime] : 输出当前语句运行的时刻
%r : 输出程序从运行到执行到当前语句时消耗的毫秒数
%d : 当前语句所在的线程ID
%p : 日志的当前优先级别
%c :当前日志对象的名称
%L : 输出语句所在的行号
%F :输出语句所在的文件名
%-数字 :表示该项的最小长度,如果不够,则用空格填充

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!