(转载)非常完善的Log4net配置详细说明

匿名 (未验证) 提交于 2019-12-02 23:59:01

一、前言

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

Log4Net介绍

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

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

二、配置说明

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

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

这篇文章写了有几年了,估计Log4Net的配置形式有些修改,园友使用时可以自己调整。

1、Log4net的主要组成部分

1.1 Appenders

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

AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式。
AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。
AspNetTraceAppender
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.2、Filters

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

1.3、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的格式化字符串见文后 三、附注

1.4、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所有的写入方法都不写到日志里,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.5、Object Renders

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

1.6、Repository

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

2、配置文件详解

2.1、配置文件构成

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

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

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

2.1.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.2、root

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

支持的子元素:

appender-ref

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

level

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

param

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

2.1.3、logger

支持的属性:

name

必须的,logger的名称

additivity

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

支持的子元素:

appender-ref

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

level

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

param

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

2.1.4、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.5、layout

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

支持的属性:

type

必须的,Layout的类型

支持的子元素:

param

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

2.1.6、filter

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

支持的属性:

type

必须的,Filter的类型

支持的子元素:

param

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

2.1.7、param

<param>元素可以是何元素的子元素。

支持的属性:

name

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

value

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

type

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

支持的子元素:

param

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

2.2、appender配置

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

2.2.1、写入回滚文件

下面就是根据我自己的实际情况,设置的我的配置

<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.3、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.4、关联配置文件

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"));

三、附注

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名要在20

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