(转载)很是完善的Log4net配置详细说明

1、前言

在项目中,对项目的日志收集是很是重要的,这里我就说说代码的异常日志收集。收集异常日志,有不少第三方成熟的框架,我这里就介绍一下我经常使用的Log4net。html

Log4Net介绍

Log4net 是 Apache 下一款很是著名的基于.net开发的记录日志开源组件,它是Log4j 的一个克隆版。Log4net记录日志的功能很是强大。它能够将日志分不一样的等级,比不一样的样式,将日志输出到不一样的媒介,而且能够进行扩展。web

官方地址:https://logging.apache.org/log4net/数据库

2、配置说明

关于Log4Net的配置介绍,园子里面有不少介绍,我看过一篇我到目前为止,介绍得最最详细的博文,这里我就直接转过来了,由于我自认为也写不出更加详细的配置说明,转载过来的还有一个目的,就是为了预防博主删博文,以前就遇到过,博主不知道是删了仍是搬家了,收藏的博文就404了。apache

这里我根据实际使用状况,只转载了一些重要的配置说明,若是园友想看全文,链接地址:https://www.cnblogs.com/lzrabbit/archive/2012/03/23/2413180.html缓存

这篇文章写了有几年了,估计Log4Net的配置形式有些修改,园友使用时能够本身调整。安全

一、Log4net的主要组成部分

1.1 Appenders

Appenders用来定义日志的输出方式,即日志要写到那种介质上去。较经常使用的Log4net已经实现好了,直接在配置文件中调用便可,可参见上面配置文件例子;固然也能够本身写一个,须要从log4net.Appender.AppenderSkeleton类继承。它还能够经过配置Filters和Layout来实现日志的过滤和输出格式。网络

AdoNetAppender 将日志记录到数据库中。能够采用SQL和存储过程两种方式。
AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。
AspNetTraceAppender  能用asp.net中Trace的方式查看记录的日志。
BufferingForwardingAppender 在输出到子Appenders以前先缓存日志事件。
ConsoleAppender 将日志输出到应用程序控制台。
EventLogAppender 将日志写到Windows Event Log。
FileAppender 将日志输出到文件。
ForwardingAppender 发送日志事件到子Appenders。
LocalSyslogAppender 将日志写到local syslog service (仅用于UNIX环境下)。
MemoryAppender 将日志存到内存缓冲区。
NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
OutputDebugStringAppender 将日志输出到Debuger,若是程序没有Debuger,就输出到系统Debuger。若是系统Debuger也不可用,将忽略消息。
RemoteSyslogAppender 经过UDP网络协议将日志写到Remote syslog service。
RemotingAppender 经过.NET Remoting将日志写到远程接收端。
RollingFileAppender 将日志以回滚文件的形式写到文件中。
SmtpAppender 将日志写到邮件中。
SmtpPickupDirAppender 将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就能够阅读或发送它们。
TelnetAppender 客户端经过Telnet来接受日志事件。
TraceAppender 将日志写到.NET trace 系统。
UdpAppender 将日志以无链接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。多线程

1.二、Filters

使用过滤器能够过滤掉Appender输出的内容。过滤器一般有如下几种:
DenyAllFilter 阻止全部的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
LoggerMatchFilter 与Logger名称匹配,才记录
PropertyFilter 消息匹配指定的属性值时才被记录
StringMathFilter 消息匹配指定的字符串才被记录app

1.三、Layouts

Layout用于控制Appender的输出格式,能够是线性的也能够是XML。
一个Appender只能有一个Layout。
最经常使用的Layout应该是经典格式的PatternLayout,其次是SimpleLayoutRawTimeStampLayoutExceptionLayout。而后还有IRawLayoutXMLLayout等几个,使用较少。Layout能够本身实现,须要从log4net.Layout.LayoutSkeleton类继承,来输出一些特殊须要的格式,在后面扩展时就从新实现了一个Layout。
SimpleLayout简单输出格式,只输出日志级别与消息内容。
RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。样式如“yyyy-MM-dd HH:mm:ss“
ExceptionLayout须要给Logger的方法传入Exception对象做为参数才起做用,不然就什么也不输出。输出的时候会包含Message和Trace。
PatterLayout使用最多的一个Layout,能输出的信息不少,使用方式可参见上面例子中的配置文件。PatterLayout的格式化字符串见文后 3、附注框架

1.四、Loggers

Logger是直接和应用程序交互的组件。Logger只是产生日志,而后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。
Logger提供了多种方式来记录一个日志消息,也能够有多个Logger同时存在。每一个实例化的Logger对象对被log4net做为命名实体(Named Entity)来维护。log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每一个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");

1.五、Object Renders

它将告诉logger如何把一个对象转化为一个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)
例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。因此要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,而后注册它(咱们在本文中的扩展不使用这种方法,而是直接实现一个自定义的Layout)。这时logger就会知道如何把Orange记录到日志中了。

1.六、Repository

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

二、配置文件详解

2.一、配置文件构成

主要有两大部分:
一是申明一个名为“log4net“的自定义配置节,以下所示:

<configSections>
     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>

二是<log4net>节的具体配置,这是下面要重点说明的。

2.1.一、log4net

全部的配置都要在<log4net>元素里定义。
支持的属性:

debug

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

update

可选,取值是Merge(合并)Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。

threshold

可选,取值是repository(库)中注册的level,默认值是ALL

支持的子元素:

appender

0或多个

logger

0或多个

renderer

0或多个

root

最多一个

param

0或多个

2.1.二、root

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

支持的子元素:

appender-ref

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

level

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

param

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

2.1.三、logger

支持的属性:

name

必须的,logger的名称

additivity

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

支持的子元素:

appender-ref

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

level

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

param

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

2.1.四、appender

定义日志的输出方式,只能做为 log4net 的子元素。name属性必须惟一,type属性必须指定。

支持的属性:

name

必须的,Appender对象的名称

type

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

支持的子元素:

appender-ref

0个或多个,容许此appender引用其余appender,并非因此appender类型都支持。

filter

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

layout

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

param

0个或多个, 设置Appender类中对应的属性的值。

实际上<appender>所能包含的子元素远不止上面4个。

2.1.五、layout

布局,只能做为<appender>的子元素。

支持的属性:

type

必须的,Layout的类型

支持的子元素:

param

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

2.1.六、filter

过滤器,只能做为<appender>的子元素。

支持的属性:

type

必须的,Filter的类型

支持的子元素:

param

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

2.1.七、param

<param>元素能够是何元素的子元素。

支持的属性:

name

必须的,取值是父对象的参数名。

value

可选的,valuetype中,必须有一个属性被指定。value是一个能被转化为参数值的字符串。

type

可选的,valuetype中,必须有一个属性被指定。type是一个类型名,若是type不是在log4net程序集中定义的,就须要使用全名。

支持的子元素:

param

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

2.二、appender配置

<appender>在配置文件中至少有一个,也能够有多个,有些<appender>类型还能够引用其余<appender>类型,具体参数可参见上表。
下面只对写入回滚文件与输出到数据库(这里使用SQL数据库)配置体会说一下,其余配置可参考官方网站:http://logging.apache.org/log4net/release/config-examples.html

2.2.一、写入回滚文件

下面就是根据我本身的实际状况,设置的个人配置

<log4net debug="false">
    <root>
      <level value="ALL" />
    </root>

    <logger name="PFTLog">
      <level value="DEBUG"/>
      <appender-ref ref="ErrorRollingFileAppender" />
      <appender-ref ref="DebugRollingFileAppender" />
      <appender-ref ref="InfoRollingFileAppender" />
    </logger>

    <!--数据日志-->
    <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
      <file value="LogFile\Info\" />
      <appendToFile value="true" />
      <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <Encoding value="UTF-8" />
      <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
      <MaxSizeRollBackups value="20" />
      <!--是否只写到一个文件中-->
      <StaticLogFileName value="false" />
      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Composite" />
      <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
      <!--这是按日期产生文件夹,并在文件名前也加上日期-->
      <datePattern value="yyyyMMdd-&quot;-Info.log&quot;" />
      <!--每一个文件的大小。
      只在混合方式与文件大小方式下使用。
      超出大小后在全部文件名后自动增长正整数从新命名,数字最大的最先写入。可用的单位:KB|MB|GB。
      不要使用小数,不然会一直写入当前日志-->
      <maximumFileSize value="1MB" />
      <!--计数类型为1,2,3…-->
      <!--<CountDirection value="1" />-->
      <!--记录的格式。通常用log4net.Layout.PatternLayout布局-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n记录时间:%date %n线程ID[%thread]
                           %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property
                           -%n异常:%exception %n错误描述:%message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
    </appender>

    <!--错误日志-->
    <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
      <file value="LogFile\Error\" />
      <appendToFile value="true" />
      <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <Encoding value="UTF-8" />
      <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
      <MaxSizeRollBackups value="20" />
      <!--是否只写到一个文件中-->
      <StaticLogFileName value="false" />
      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Composite" />
      <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
      <!--这是按日期产生文件夹,并在文件名前也加上日期-->
      <datePattern value="yyyyMMdd&quot;-Error.log&quot;" />
      <!--每一个文件的大小。
      只在混合方式与文件大小方式下使用。
      超出大小后在全部文件名后自动增长正整数从新命名,数字最大的最先写入。可用的单位:KB|MB|GB。
      不要使用小数,不然会一直写入当前日志-->
      <maximumFileSize value="1MB" />
      <!--计数类型为1,2,3…-->
      <!--<CountDirection value="1" />-->
      <!--记录的格式。通常用log4net.Layout.PatternLayout布局-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n记录时间:%date %n线程ID[%thread]
                           %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property
                           -%n异常:%exception %n错误描述:%message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="ERROR" />
      </filter>
    </appender>

    <!--调试日志-->
    <appender name="DebugRollingFileAppender" type="log4net.Appender.RollingFileAppender" >
      <file value="LogFile\Debug\" />
      <appendToFile value="true" />
      <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <Encoding value="UTF-8" />
      <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
      <MaxSizeRollBackups value="20" />
      <!--是否只写到一个文件中-->
      <StaticLogFileName value="false" />
      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
      <rollingStyle value="Composite" />
      <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
      <!--这是按日期产生文件夹,并在文件名前也加上日期-->
      <datePattern value="yyyyMMdd&quot;-Debug.log&quot;" />
      <!--每一个文件的大小。
      只在混合方式与文件大小方式下使用。
      超出大小后在全部文件名后自动增长正整数从新命名,数字最大的最先写入。可用的单位:KB|MB|GB。
      不要使用小数,不然会一直写入当前日志-->
      <maximumFileSize value="1MB" />
      <!--计数类型为1,2,3…-->
      <!--<CountDirection value="1" />-->
      <!--记录的格式。通常用log4net.Layout.PatternLayout布局-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n记录时间:%date %n线程ID[%thread]
                           %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property
                           -%n异常:%exception %n错误描述:%message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="DEBUG" />
      </filter>
    </appender>

  </log4net>
View Code

注意这些配置属性有些是可选的,若是须要,必定要写正确,不然要么输出的不是本身想要的结果,要么干脆不输出任何信息。

由于我不会将日志直接写入数据库,因此这里我就不写了。

2.三、logger配置

在配置文件<appender>中的配置好了输出的介质,格式,过滤方式,还要定义日志对象<logger>。
在框架的体系里,全部的日志对象都是根日志(root logger)的后代。 所以若是一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在<root>标签里,能够定义level级别值和Appender的列表。若是没有定义LEVEL的值,则缺省为DEBUG。能够经过<appender-ref>标签订义日志对象使用的Appender对象。<appender-ref>声明了在其余地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来讲,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也能够经过显式地设定<logger>标签的additivity属性为false而改变。
<root>不显式申明时使用默认的配置。我以为在使用时不定义<root>,自定义多个<logger>,在程序中记录日志时直接使用<logger>的name来查找相应的<logger>,这样更灵活一些。例如:

<!--同时写两个文件和数据库-->
<logger name="ReflectionLayout">
       <level value="DEBUG"/>
       <appender-ref ref="HashtableLayout"/>
       <appender-ref ref="ReflectionLayout"/>
       <appender-ref ref="ADONetAppender"/>
 </logger>
View Code

2.四、关联配置文件

log4net默认关联的是应用程序的配置文件App.config(BS程序是Web.config),可使用程序集自定义属性来进行设置。下面来介绍一下这个自定义属性:
log4net.Config.XmlConifguratorAttribute

XmlConfiguratorAttribute有3个属性:
ConfigFile: 配置文件的名字,文件路径相对于应用程序目录(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile属性不能和ConfigFileExtension属性一块儿使用。
ConfigFileExtension: 配置文件的扩展名,文件路径相对于应用程序的目录。ConfigFileExtension属性不能和ConfigFile属性一块儿使用。
Watch: 若是将Watch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会从新加载。
若是ConfigFile和ConfigFileExtension都没有设置,则使用应用程序的配置文件App.config(Web.config)。

能够在项目的AssemblyInfo.cs文件里添加如下的语句:
 

//监视默认的配置文件,App.exe.config   
 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

//监视配置文件,App.exe.log4net。
[assembly: log4net. Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]

//使用配置文件log4net.config,不监视改变。注意log4net.config文件的目录,BS程序在站点目录//下,CS则在应用程序启动目录下,如调试时在/bin/Debug下,通常将文件属性的文件输出目录调为//始终复制便可
[assembly: log4net. Config.XmlConfigurator(ConfigFile = "log4net.config")]

//使用配置文件log4net.config,不监视改变
[assembly: log4net. Config.XmlConfigurator()]

也能够在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里必定是绝对路径,以下所示:

//这是在BS程序下,使用自定义的配置文件log4net.xml,使用Server.MapPath("~") + //@"/log4net.xml”来取得路径。/log4net.xml为相对于站点的路径

// ConfigureAndWatch()至关于Configure(Watch = true)
log4net.Config.XmlConfigurator.ConfigureAndWatch(
new System.IO.FileInfo(Server.MapPath("~") + @"/log4net.xml"));
//这是在CS程序下,能够用如下方法得到:
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
 string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
 string configFilePath = assemblyDirPath + " //log4net.xml";
 log4net.Config.XmlConfigurator.ConfigureAndWatch(
 new FileInfo(configFilePath));

或直接使用绝对路径:

//使用自定义的配置文件,直接绝对路径为:c:/log4net.config
 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"c:/log4net.config"));

3、附注

PatterLayout格式化字符表

转换字符

效果

a

等价于appdomain

appdomain

引起日志事件的应用程序域的友好名称。(使用中通常是可执行文件的名字。)

c

等价于 logger

C

等价于 type

class

等价于 type

d

等价于 date

date

发生日志事件的本地时间。 使用 DE>%utcdate 输出UTC时间。date后面还能够跟一个日期格式,用大括号括起来。DE>例如:%date{HH:mm:ss,fff}或者%date{dd MMM yyyy HH:mm:ss,fff}。若是date后面什么也不跟,将使用ISO8601 格式 

日期格式和.NetDateTime类的ToString方法中使用的格式是同样。

另外log4net还有3个本身的格式Formatter 它们是 "ABSOLUTE", "DATE""ISO8601"分别表明 AbsoluteTimeDateFormatter, DateTimeDateFormatterIso8601DateFormatter。例如:%date{ISO8601}%date{ABSOLUTE}

它们的性能要好于ToString

exception

异常信息

日志事件中必须存了一个异常对象,若是日志事件不包含没有异常对象,将什么也不输出。异常输出完毕后会跟一个换行。通常会在输出异常前加一个换行,并将异常放在最后。

F

等价于 file

file

发生日志请求的源代码文件的名字。

警告:只在调试的时候有效。调用本地信息会影响性能。

identity

当前活动用户的名字(Principal.Identity.Name).

警告:会影响性能。(我测试的时候%identity返回都是空的。)

l

等价于 location

L

等价于 line

location

引起日志事件的方法(包括命名空间和类名),以及所在的源文件和行号。

警告:会影响性能。没有pdb文件的话,只有方法名,没有源文件名和行号。

level

日志事件等级

line

引起日志事件的行号

警告:会影响性能。

logger

记录日志事件的Logger对象的名字。

可使用精度说明符控制Logger的名字的输出层级,默认输出全名。

注意,精度符的控制是从右开始的。例如:logger 名为 "a.b.c" 输出模型为%logger{2} ,将输出"b.c"

m

等价于 message

M

等价于 method

message

由应用程序提供给日志事件的消息。

mdc

MDC (旧为:ThreadContext.Properties) 如今是事件属性的一部分。 保留它是为了兼容性,它等价于 property

method

发生日志请求的方法名(只有方法名而已)。

警告:会影响性能。

n

等价于 newline

newline

换行符

ndc

NDC (nested diagnostic context)

p

等价于 level

P

等价于 property

properties

等价于 property

property

输出事件的特殊属性。例如: %property{user} 输出user属性。属性是由loggersappenders添加到时间中的。 有一个默认的属性"DE>log4net:HostName"老是会有。DE>

%property将输出全部的属性 

(扩展后可使用)

 

r

等价于 timestamp

t

等价于 thread

timestamp

从程序启动到事件发生所通过的毫秒数。

thread

引起日志事件的线程,若是没有线程名就使用线程号。

type

引起日志请求的类的全名。.

可使用精度控制符。例如: 类名是 "log4net.Layout.PatternLayout", 格式模型是%type{1} 将输出"PatternLayout"。(也是从右开始的。)

警告:会影响性能。

u

等价于 identity

username

当前用户的WindowsIdentity。(相似:HostName/Username

警告:会影响性能。

utcdate

发生日志事件的UTC时间。DE>后面还能够跟一个日期格式,用大括号括起来。DE>例如:%utcdate{HH:mm:ss,fff}或者%utcdate{dd MMM yyyy HH:mm:ss,fff}。若是utcdate后面什么也不跟,将使用ISO8601 格式 

日期格式和.NetDateTime类的ToString方法中使用的格式是同样。

另外log4net还有3个本身的格式Formatter 它们是 "ABSOLUTE", "DATE""ISO8601"分别表明 AbsoluteTimeDateFormatter, DateTimeDateFormatterIso8601DateFormatter。例如:%date{ISO8601}%date{ABSOLUTE}

它们的性能要好于ToString

w

等价于 username

x

等价于 ndc

X

等价于 mdc

%

%%输出一个百分号

关于调用本地信息(caller location information)的说明:

%type %file %line %method %location %class %C %F %L %l %M 都会调用本地信息。这样作会影响性能。本地信息使用System.Diagnostics.StackTrace获得。.Net 1.0 不支持System.Diagnostics.StackTrace 类。

本地信息在调试模式下能够正常获取,在非调试模式下可能获取不到,或只能获取一部分。(根据个人测试,实际上是须要有一个程序数据库(.pdb)文件。)

%property属性要用代码来设置才能使用(也就是扩展一下),

默认属性log4net:HostName不用设置。

转义字符的修饰符:

Format modifier

left justify

minimum width

maximum width

comment

%20logger

false

20

none

若是logger名不足20个字符,就在左边补空格。

%-20logger

true

20

none

若是logger名不足20个字符,就在右边补空格。

%.30logger

NA

none

30

超过30个字符将截断。

%20.30logger

false

20

30

logger名要在2030之间,少了在左边补空格,多了截断。

%-20.30logger

true

20

30

logger名要在2030之间,少了在右边补空格,多了截断。

 

4、总结

Log4Net的功能还有不少,好比他的扩展等,就不介绍了,由于通常的功能以及足够咱们在平时的开发过程当中使用了,后面我将Log4Net日志记录用.Net实现方法分享出来。Log4Net还能够与其余软件结合,好比Kibana,而Kibana又能结合Elastic Search。在分布式的项目发布中,以及海量的日志查询中,效率是很是高的。

转载链接:

https://www.cnblogs.com/lzrabbit/archive/2012/03/23/2413180.html

相关文章
相关标签/搜索