一、媒介
在项目中,对项目标日志网络是非常紧张的,这里我就说说代码的异常日志网络。网络异常日志,有很多第三方成熟的框架,我这里就介绍一下我常用的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 能用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.2、Filters
利用过滤器可以过滤掉Appender输出的内容。过滤器通常有以下几种:
DenyAllFilter 阻止所有的日志变乱被记录
LevelMatchFilter 只有指定品级的日志变乱才被记录
LevelRangeFilter 日志品级在指定范围内的变乱才被记录
LoggerMatchFilter 与Logger名称匹配,才记录
PropertyFilter 消息匹配指定的属性值时才被记录
StringMathFilter 消息匹配指定的字符串才被记录
1.3、Layouts
Layout用于控制Appender的输特别式,可以是线性的也可以是XML。
一个Appender只能有一个Layout。
最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后另有IRawLayout,XMLLayout等几个,利用较少。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 > 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.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>
复制代码
二是节的具体设置,这是下面要重点说明的。
2.1.1、log4net
所有的设置都要在元素里定义。
支持的属性:
debug
|
可选,取值是true或false,默认是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
|
可选,取值是true或false,默认值是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类中对应的属性的值。
|
实际上所能包含的子元素远不止上面4个。
2.1.5、layout
结构,只能作为的子元素。
支持的属性:
支持的子元素:
2.1.6、filter
过滤器,只能作为的子元素。
支持的属性:
支持的子元素:
2.1.7、param
元素可以是任何元素的子元素。
支持的属性:
name
|
必须的,取值是父对象的参数名。
|
value
|
可选的,value和type中,必须有一个属性被指定。value是一个能被转化为参数值的字符串。
|
type
|
可选的,value和type中,必须有一个属性被指定。type是一个范例名,如果type不是在log4net步调集中定义的,就必要利用全名。
|
支持的子元素:
2.2、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-"-Info.log"" />
- <!--每个文件的巨细。
- 只在混合方式与文件巨细方式下利用。
- 超出巨细后在所有文件名后自动增长正整数重新命名,数字最大的最早写入。可用的单位: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"-Error.log"" />
- <!--每个文件的巨细。
- 只在混合方式与文件巨细方式下利用。
- 超出巨细后在所有文件名后自动增长正整数重新命名,数字最大的最早写入。可用的单位: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"-Debug.log"" />
- <!--每个文件的巨细。
- 只在混合方式与文件巨细方式下利用。
- 超出巨细后在所有文件名后自动增长正整数重新命名,数字最大的最早写入。可用的单位: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设置
在设置文件中的设置好了输出的介质,格式,过滤方式,还要定义日志对象。
在框架的体系里,所有的日志对象都是根日志(root logger)的子女。 因此如果一个日志对象没有在设置文件里显式定义,则框架利用根日志中定义的属性。在标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过标签订义日志对象利用的Appender对象。声明白在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继续父日志对象的Appender列表。这种缺省的举动方式也可以通过显式地设定标签的additivity属性为false而改变。
不显式申明时利用默认的设置。我觉得在利用时不定义,自定义多个,在步调中记录日志时直接利用的name来查找相应的,这样更灵活一些。比方:
- <!--同时写两个文件和数据库-->
- <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 格式 。
日期格式和.Net中DateTime类的ToString方法中利用的格式是一样。
另外log4net另有3个本身的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。比方:%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属性。属性是由loggers或appenders添加到时间中的。 有一个默认的属性"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 格式 。
日期格式和.Net中DateTime类的ToString方法中利用的格式是一样。
另外log4net另有3个本身的格式Formatter。 它们是 "ABSOLUTE", "DATE"和"ISO8601"分别代表 AbsoluteTimeDateFormatter, DateTimeDateFormatter和Iso8601DateFormatter。比方:%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名要在20到30之间,少了在左边补空格,多了截断。
|
%-20.30logger
|
true
|
20
|
30
|
logger名要在20到30之间,少了在右边补空格,多了截断。
|
四、总结
Log4Net的功能另有很多,比如他的扩展等,就不介绍了,由于一样平常的功能以及足够我们在平常的开辟过程中利用了,背面我将Log4Net日志记任命.Net实现方法分享出来。Log4Net还可以与其他软件结合,比如Kibana,而Kibana又能结合Elastic Search。在分布式的项目发布中,以及海量的日志查询中,服从是非常高的。
转载毗连:
https://www.cnblogs.com/lzrabbit/archive/2012/03/23/2413180.html
来源:https://www.cnblogs.com/snailblog/p/11484027.html |