威尼斯人线上娱乐

【威尼斯人线上娱乐】不行健全的Log4net详细表达,Log四net使用详细表明

10 4月 , 2019  

前提题要:因为自个儿近日承担的Winform项目,好多都用到了那些log四net的日志作用,开发顺序对数据1般都务求做到雁过留痕,所以日志对于大家程序员是须要。由此小编把对log四net的应用做多少个笔录总计,以便于事后的利用回忆。l

1、概述

log肆net是.Net下一个那么些美好的开源日志记录组件。log四net记录日志的功用更强劲。它能够将日志分分歧的阶段,以差异的格式,输出到不相同的媒人。本文首若是介绍怎样在Visual
Studio二零一零中应用log4net快捷成立系统日志,如何扩张以出口自定义字段。

1、概述

log肆net是.Net下二个百般精粹的开源日志记录组件。log四net记录日志的功用尤其强劲。它能够将日志分不一样的阶段,以不相同的格式,输出到分歧的媒婆。本文主固然介绍怎么着在Visual
Studio贰零零8中接纳log肆net飞快创造系统日志,怎么着扩大以出口自定义字段。

1、概述

log四net是.Net下一个13分非凡的开源日志记录组件。log四net记录日志的作用万分强大。它能够将日志分分裂的级差,以差别的格式,输出到区别的介绍人。本文首要是介绍如何在Visual
Studio二零一零中接纳log肆net连忙创制系统日志,怎样增添以出口自定义字段。

一、概述

贰、二个简单易行的应用实例

第一步:在类型中添加对log肆net.dll的引用,这里引用版本是一.2.10.0。

第二步:先后运营时读取log肆net的安插文件。

如假若CS程序,在根目录的Program.cs中的Main方法中添加:

log4net.Config.XmlConfigurator.Configure();

倘假使BS程序,在根目录的Global.asax.cs(未有新建1个)中的Application_Start方法中增加:

log4net.Config.XmlConfigurator.Configure();

无论是BS照旧CS程序都可直接在类型的AssemblyInfo.cs文件里拉长以下的说话:

[assembly: log4net.Config .XmlConfigurator()]

也可以选拔自定义的配备文件,具体请参见4.4 关联配置文件。

第三步:修改配置文件。假使是CS程序,则在私下认可的App.config文件(未有新建1个)中添加内容;即便是BS程序,则添加到Web.config文件中,添加始末相同,那里不再列出。

App.config文件添加内容如下:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 
 3 <configuration>
 4 
 5   <configSections>
 6 
 7 <section name="log4net"
 8 
 9 type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
10 
11   </configSections>
12 
13  
14 
15   <log4net>
16 
17     <root>
18 
19       <level value="WARN" />
20 
21       <appender-ref ref="LogFileAppender" />
22 
23       <appender-ref ref="ConsoleAppender" />
24 
25     </root>
26 
27  
28 
29     <logger name="testApp.Logging">
30 
31       <level value="DEBUG"/>
32 
33     </logger>
34 
35  
36 
37     <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
38 
39       <param name="File" value="log-file.txt" />
40 
41       <param name="AppendToFile" value="true" />
42 
43  
44 
45       <layout type="log4net.Layout.PatternLayout">
46 
47         <param name="Header" value="[Header] "/>
48 
49         <param name="Footer" value="[Footer] "/>
50 
51         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n" />
52 
53       </layout>
54 
55  
56 
57       <filter type="log4net.Filter.LevelRangeFilter">
58 
59         <param name="LevelMin" value="DEBUG" />
60 
61         <param name="LevelMax" value="WARN" />
62 
63       </filter>
64 
65     </appender>
66 
67  
68 
69     <appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >
70 
71       <layout type="log4net.Layout.PatternLayout">
72 
73         <param name="ConversionPattern"  value="%d [%t] %-5p %c [%x] - %m%n" />
74 
75       </layout>
76 
77     </appender> 
78 
79   </log4net>
80 
81 </configuration>

第四步:在先后选用。

log4net.ILog log =
log肆net.LogManager.GetLogger(“testApp.Logging”);//获取二个日志记录器

log.Info(DateTime.Now.ToString() + “: login success”);//写入一条新log

如此那般就将新闻并且输出到控制台和写入到文件名称为“log-file.txt”的文件中,在那之中“log-file.txt”文件的路径是当前程序运转所在目录;也能够定义为相对路径,配置如:

<param name=”File” value=”C:/log-file.txt” />就写入C盘根目录下log-file.txt文件中

二、3个粗略的应用实例

第一步:在档次中添加对log四net.dll的引用,那里引用版本是一.2.十.0。

第二步:程序运维时读取log四net的布局文件。

倘诺是CS程序,在根目录的Program.cs中的Main方法中加上:

log4net.Config.XmlConfigurator.Configure();

假诺是BS程序,在根目录的Global.asax.cs(未有新建贰个)中的Application_Start方法中增进:

log4net.Config.XmlConfigurator.Configure();

不论BS照旧CS程序都可径直在档次的AssemblyInfo.cs文件里拉长以下的言辞:

[assembly: log4net.Config .XmlConfigurator()]

也得以采纳自定义的安顿文件,具体请参见四.肆 关联配置文件。

第三步:修改配置文件。假诺是CS程序,则在默许的App.config文件(没有新建一个)中添加内容;即便是BS程序,则添加到Web.config文件中,添加始末相同,那里不再列出。

App.config文件添加内容如下:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 
 3 <configuration>
 4 
 5   <configSections>
 6 
 7 <section name="log4net"
 8 
 9 type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
10 
11   </configSections>
12 
13  
14 
15   <log4net>
16 
17     <root>
18 
19       <level value="WARN" />
20 
21       <appender-ref ref="LogFileAppender" />
22 
23       <appender-ref ref="ConsoleAppender" />
24 
25     </root>
26 
27  
28 
29     <logger name="testApp.Logging">
30 
31       <level value="DEBUG"/>
32 
33     </logger>
34 
35  
36 
37     <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
38 
39       <param name="File" value="log-file.txt" />
40 
41       <param name="AppendToFile" value="true" />
42 
43  
44 
45       <layout type="log4net.Layout.PatternLayout">
46 
47         <param name="Header" value="[Header] "/>
48 
49         <param name="Footer" value="[Footer] "/>
50 
51         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n" />
52 
53       </layout>
54 
55  
56 
57       <filter type="log4net.Filter.LevelRangeFilter">
58 
59         <param name="LevelMin" value="DEBUG" />
60 
61         <param name="LevelMax" value="WARN" />
62 
63       </filter>
64 
65     </appender>
66 
67  
68 
69     <appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >
70 
71       <layout type="log4net.Layout.PatternLayout">
72 
73         <param name="ConversionPattern"  value="%d [%t] %-5p %c [%x] - %m%n" />
74 
75       </layout>
76 
77     </appender> 
78 
79   </log4net>
80 
81 </configuration>

第四步:在先后行使。

log四net.ILog log =
log肆net.LogManager.GetLogger(“testApp.Logging”);//获取贰个日记记录器

log.Info(Date提姆e.Now.ToString() + “: login success”);//写入一条新log

如此那般就将音讯同时输出到控制台和写入到文件名叫“log-file.txt”的公文中,其中“log-file.txt”文件的途径是方今程序运转所在目录;也得以定义为相对路径,配置如:

<param name=”File” value=”C:/log-file.txt” />就写入C盘根目录下log-file.txt文件中

二、Log四net的要紧组成都部队分

       log四net是.Net下二个百般美妙的开源日志记录组件。
他是apache协会上面包车型大巴2个工程,详见Apache介绍:https://baike.baidu.com/item/Apache软件基金会/291276九?fr=aladdin,
 
log肆net记录日志的成效10分强劲。它能够将日志分不一样的阶段,以不一致的格式,输出到分化的介绍人。

3、Log肆net的基本点组成都部队分

三、Log肆net的要紧组成都部队分

2.1 Appenders

Appenders用来定义日志的输出方式,即日志要写到那种介质上去。较常用的Log四net已经落实好了,间接在安排文件中调用即可,可参见上面配置文件例子;当然也能够友善写三个,须求从log肆net.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的形式广播。

二、2个小的案例完成进程

3.1 Appenders

Appenders用来定义日志的出口格局,即日志要写到那种介质上去。较常用的Log4net已经落成好了,直接在安插文件中调用即可,可参见下面配置文件例子;当然也足以团结写一个,须要从log四net.Appender.AppenderSkeleton类继承。它还足以由此安顿Filters和Layout来促成日志的过滤和输出格式。

已经落到实处的出口方式有:

AdoNetAppender 将日志记录到数据库中。能够选用SQL和存款和储蓄进程三种格局。

AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。

AspNetTraceAppender  能用asp.net中Trace的章程查看记录的日记。

BufferingForwardingAppender 在出口到子Appenders以前先缓存日志事件。

ConsoleAppender 将日志输出到应用程控台。

伊夫ntLogAppender 将日志写到Windows 伊夫nt 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的花样播放。

3.1 Appenders

Appenders用来定义日志的出口情势,即日志要写到那种介质上去。较常用的Log四net已经实现好了,直接在配置文件中调用即可,可参见上面配置文件例子;当然也得以协调写二个,须要从log肆net.Appender.AppenderSkeleton类继承。它还足以透过安插Filters和Layout来落实日志的过滤和出口格式。

早就达成的输出方式有:

AdoNetAppender 将日志记录到数据库中。能够行使SQL和仓库储存进度二种艺术。

AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。

AspNetTraceAppender  能用asp.net中Trace的主意查看记录的日记。

BufferingForwardingAppender 在出口到子Appenders在此之前先缓存日志事件。

ConsoleAppender 将日志输出到应用程控台。

伊芙ntLogAppender 将日志写到Windows 伊芙nt 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 将音讯以文件的方法放入1个索引中,像IIS SMTP
agent那样的SMTP代理就能够阅读或发送它们。

TelnetAppender 客户端通过Telnet来经受日志事件。

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

UdpAppender 将日志以无连接UDP数据报的样式送到长途宿主或用UdpClient的情势播放。

2.2 Filters

使用过滤器能够过滤掉Appender输出的内容。过滤器经常有以下二种:

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

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

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

LoggerMatchFilter 与Logger名称匹配,才记录

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

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

    第壹步、在类型中添加对log四net的引用,若是未有的话,能够手动在NuGet包里面寻找下载添加

3.2 Filters

应用过滤器可以过滤掉Appender输出的剧情。过滤器平常有以下两种:

DenyAllFilter 阻止全部的日记事件被记录

LevelMatchFilter 唯有钦点等级的日记事件才被记录

LevelRangeFilter 日志等级在钦命范围内的风云才被记录

LoggerMatchFilter 与Logger名称相称,才记录

PropertyFilter 音信相配内定的属性值时才被记录

StringMathFilter 音讯相称钦点的字符串才被记录

3.2 Filters

行使过滤器能够过滤掉Appender输出的始末。过滤器日常有以下两种:

DenyAllFilter 阻止全数的日志事件被记录

LevelMatchFilter 唯有钦定等级的日记事件才被记录

LevelRangeFilter 日志等级在钦赐范围内的轩然大波才被记录

LoggerMatchFilter 与Logger名称相配,才记录

PropertyFilter 消息相称钦命的属性值时才被记录

StringMathFilter 音信相配钦赐的字符串才被记录

2.3 Layouts

Layout用于控制Appender的输出格式,可以是线性的也得以是XML。

二个Appender只好有三个Layout。

最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,Raw提姆eStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等多少个,使用较少。Layout能够团结达成,需求从log4net.Layout.LayoutSkeleton类继承,来输出一些非正规要求的格式,在末端扩张时就再次达成了1个Layout。

SimpleLayout不难输出格式,只输出日志级别与消息内容。

RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。

样式如“yyyy-MM-dd HH:mm:ss“

ExceptionLayout必要给Logger的措施传入Exception对象作为参数才起成效,不然就什么样也不出口。输出的时候会含有Message和Trace。

PatterLayout使用最多的2个Layout,能出口的消息很多,使用方法可参见上边例子中的配置文件。PatterLayout的格式化字符串见文后附注八.1。

    第2步、设置配置文件

3.3 Layouts

Layout用于控制Appender的出口格式,能够是线性的也得以是XML。

一个Appender只可以有1个Layout。

最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等多少个,使用较少。Layout能够本身实现,须求从log四net.Layout.LayoutSkeleton类继承,来输出一些非正规供给的格式,在前边扩张时就重新达成了1个Layout。

SimpleLayout简单输出格式,只输出日志级别与音信内容。

RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。

样式如“yyyy-MM-dd HH:mm:ss“

ExceptionLayout要求给Logger的方法传入Exception对象作为参数才起效果,否则就怎么也不出口。输出的时候会蕴藏Message和Trace。

PatterLayout使用最多的2个Layout,能出口的新闻很多,使用方法可参见下面例子中的配置文件。PatterLayout的格式化字符串见文后附注8.一。

3.3 Layouts

Layout用于控制Appender的出口格式,能够是线性的也足以是XML。

2个Appender只好有2个Layout。

最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等多少个,使用较少。Layout能够友善完毕,供给从log肆net.Layout.LayoutSkeleton类继承,来输出1些特种须要的格式,在后边扩充时就再也实现了多个Layout。

SimpleLayout不难输出格式,只输出日志级别与音讯内容。

RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。

样式如“yyyy-MM-dd HH:mm:ss“

ExceptionLayout供给给Logger的方法传入Exception对象作为参数才起功用,不然就什么样也不出口。输出的时候会蕴藏Message和Trace。

PatterLayout使用最多的2个Layout,能出口的音讯很多,使用办法可参见上边例子中的配置文件。PatterLayout的格式化字符串见文后附注八.一。

2.4 Loggers

Logger是一直和应用程序交互的零件。Logger只是发破壳日志,然后由它引用的Appender记录到钦赐的红娘,并由Layout控制输出格式。

Logger提供了多种方式来记录二个日志信息,也能够有三个Logger同时设有。各类实例化的Logger对象对被log四net作为命名实体(Named
Entity)来爱抚。log四net使用持续类别,也正是说若是存在五个Logger,名字分别为a.b.c和a.b。那么a.b正是a.b.c的祖辈。每一个Logger都一而再了它祖先的习性。全数的Logger都从Root继承,Root自个儿也是1个Logger。

日记的级差,它们由高到底分别为:

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

超过等级设定值方法(咋样设置参见“配置文件详解”)都能写入日志,
Off全部的写入措施都不写到日志里,ALL则相反。例如当我们设成Info时,logger.Debug就会被忽视而不写入文件,不过FATAL,EBMWX3RO兰德PRADO,WARN,INFO会被写入,因为他俩等级高于INFO。

在切实可行写日记时,一般能够那样理解日志等级:

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

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

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

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

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

Logger达成的ILog接口,ILog定义了5个格局(Debug,Info,Warn,Error,Fatal)分别对差异的日志等级记录日志。那些法子还有伍个重载。以Debug为例说澳优下,其余的和它基本上。

ILog中对Debug方法的概念如下:

void Debug(object message);

void Debug(object message, Exception ex);

【威尼斯人线上娱乐】不行健全的Log4net详细表达,Log四net使用详细表明。再有一个布尔属性:

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

以此是自身的winfrom里面包车型客车配备,供参考

3.4 Loggers

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

Logger提供了各个艺术来记录一个日记新闻,也足以有五个Logger同时存在。每一个实例化的Logger对象对被log四net作为命名实体(Named
Entity)来保卫安全。log四net使用持续连串,也便是说固然存在三个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,ELX570RO安德拉,WA中华VN,INFO会被写入,因为她俩等级高于INFO。

在切切实实写日记时,一般能够如此敞亮日志等级:

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

EPAJERORO奇骏(壹般错误):记录系统中冒出的导致系统不稳定,部分机能出现混乱或1些功效失效一类的荒谬。例如,数据字段为空,数据操作不可完毕,操作出现格外等。

WAHummerH二N(警告):记录系统中不影响系统持续运转,但不合乎系统运转如常尺度,有相当的大恐怕滋生系统错误的新闻。例如,记录内容为空,数据内容不正确等。

INFO(一般信息):记录系统运作中应有让用户知道的为主音讯。例如,服务初叶运转,作用已经开户等。

DEBUG (调节和测试音讯):记录系统用于调节和测试的总体消息,内容照旧是一些最主要数据内容的输出。

Logger达成的ILog接口,ILog定义了八个办法(Debug,Inof,Warn,Error,Fatal)分别对不相同的日志等级记录日志。那四个主意还有陆个重载。以Debug为例说美赞臣(Meadjohnson)下,此外的和它基本上。

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

void Debug(object message);

void Debug(object message, Exception ex);

再有3个布尔属性:

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

3.4 Loggers

Logger是一向和应用程序交互的零件。Logger只是发出生之日志,然后由它引用的Appender记录到钦赐的介绍人,并由Layout控制输出格式。

Logger提供了各样主意来记录一个日志新闻,也能够有四个Logger同时设有。每一种实例化的Logger对象对被log4net作为命名实体(Named
Entity)来尊敬。log肆net使用持续体系,也正是说如果存在多少个Logger,名字分别为a.b.c和a.b。那么a.b正是a.b.c的祖先。各个Logger都连续了它祖先的习性。全数的Logger都从Root继承,Root本身也是3个Logger。

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

威尼斯人线上娱乐 ,OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 

过量等级设定值方法(怎么着设置参见“配置文件详解”)都能写入日志, Off全体的写入措施都不写到日志里,ALL则相反。例如当大家设成Info时,logger.Debug就会被忽略而不写入文件,可是FATAL,E卡宴RO讴歌MDX,WAHummerH贰N,INFO会被写入,因为她俩等级高于INFO。

在切实写日记时,1般能够那样敞亮日志等级:

FATAL(致命错误):记录系统中出现的能采取系统完全失去成效,服务停止,系统崩溃等使系统不能继续运维下去的一无所能。例如,数据库不可能连接,系统出现死循环。

E路虎极光RO智跑(一般错误):记录系统中冒出的导致系统不平稳,部分成效现身混乱或部分机能失效一类的错误。例如,数据字段为空,数据操作不可实现,操作出现卓殊等。

WA途胜N(警告):记录系统中不影响系统继续运营,但不适合系统运维不荒谬标准,有非常的大可能率滋生系统错误的新闻。例如,记录内容为空,数据内容不科学等。

INFO(一般音信):记录系统运行中应当让用户明白的主导音信。例如,服务起始运维,作用已经开户等。

DEBUG (调节和测试消息):记录系统用于调试的总体音信,内容照旧是一对主要数据内容的出口。

Logger落成的ILog接口,ILog定义了两个主意(Debug,Inof,Warn,Error,Fatal)分别对两样的日记等级记录日志。那四个措施还有七个重载。以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”);

2.5 Object Renders

它将报告logger怎么着把一个对象转化为二个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)

譬如说你想把Orange对象记录到日志中,但那时logger只会调用Orange私下认可的ToString方法而已。所以要定义一个OrangeRender类完毕log四net.ObjectRender.IObjectRender接口,然后注册它(大家在本文中的增加不利用那种措施,而是一贯促成叁个自定义的Layout)。那时logger就会掌握如何把Orange记录到日志中了。

威尼斯人线上娱乐 1威尼斯人线上娱乐 2

3.5 Object Renders

它将告诉logger怎样把贰个指标转化为3个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)

比如说你想把Orange对象记录到日志中,但此刻logger只会调用Orange默许的ToString方法而已。所以要定义2个OrangeRender类达成log肆net.ObjectRender.IObjectRender接口,然后注册它(大家在本文中的扩张不应用那种方式,而是径直完成一个自定义的Layout)。那时logger就会明白什么把Orange记录到日志中了。

3.5 Object Renders

它将报告logger怎样把二个对象转化为三个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)

譬如你想把Orange对象记录到日志中,但那时logger只会调用Orange暗中认可的ToString方法而已。所以要定义叁个OrangeRender类达成log4net.ObjectRender.IObjectRender接口,然后注册它(大家在本文中的扩展不使用那种办法,而是直接促成多少个自定义的Layout)。那时logger就会明白什么样把Orange记录到日志中了。

2.6 Repository

Repository首要用以日志对象组织结构的珍贵。

 1  <configSections>
 2     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 3   </configSections>
 4   <startup useLegacyV2RuntimeActivationPolicy="true">
 5     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
 6   </startup>
 7 
 8   <log4net>
 9     <root>
10       <level value="WARN" />
11       <appender-ref ref="LogFileAppender" />
12       <appender-ref ref="ConsoleAppender" />
13     </root>
14     <logger name="Logging">
15       <level value="DEBUG" />
16     </logger>
17     <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
18       <file value="Logs/" />
19       <appendToFile value="true" />
20       <rollingStyle value="Date" />
21       <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
22       <maxSizeToRollBackups value="-1" />
23       <maximumFileSize value="100MB" />
24       <staticLogFileName value="false" />
25       <layout type="log4net.Layout.PatternLayout,log4net">
26         <conversionPattern value="%d - %-5level - %c - %m%n" />
27       </layout>
28  
29       <filter type="log4net.Filter.LevelRangeFilter">
30         <param name="LevelMin" value="DEBUG" />
31         <param name="LevelMax" value="WARN" />
32       </filter>
33     </appender>
34     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
35       <layout type="log4net.Layout.PatternLayout">
36         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
37       </layout>
38     </appender>
39   </log4net>

3.6 Repository

Repository首要用以日志对象组织结构的保卫安全。

3.6 Repository

Repository紧要用以日志对象组织结构的尊崇。

三、配置文件详解

View Code

四、配置文件详解

四、配置文件详解

3.一 配置文件构成

注重有两大片段,壹是表达一个名称为“log肆net“的自定义配置节,如下所示:

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

二是<log四net>节的切实可行安插,那是底下要重点表明的。

   第三步、

四.一 配置文件构成

根本有两大学一年级部分,一是表澳优(Ausnutria Hyproca)(Aptamil)个名称叫“log四net“的自定义配置节,如下所示:

1 <configSections>
2 
3 <section name="log4net"
4 
5 type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
6 
7   </configSections>

贰是<log4net>节的实际安排,那是上面要器重表明的。

四.一 配置文件构成

第3有两大片段,一是发美素佳儿(Friso)个名字为“log肆net“的自定义配置节,如下所示:

1 <configSections>
2 
3 <section name="log4net"
4 
5 type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
6 
7   </configSections>

二是<log四net>节的现实配置,那是底下要重点表明的。

3.1.1<log4net>

具有的布局都要在<log四net>成分里定义。
帮衬的属性:

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

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

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

倘如若CS程序,在根目录的Program.cs中的Main方法中丰硕:

4.1.1<log4net>

抱有的配备都要在<log四net>成分里定义。

协助的习性:

debug

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

update

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

threshold

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

援助的子元素:

appender

0或多个

logger

0或多个

renderer

0或多个

root

最多一个

param

0或多个

 

4.1.1<log4net>

富有的配备都要在<log四net>元素里定义。

支撑的属性:

debug

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

update

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

threshold

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

帮助的子成分:

appender

0或多个

logger

0或多个

renderer

0或多个

root

最多一个

param

0或多个

 

3.1.2 <root>

实质上就是三个根logger,全体别的logger都暗中同意继承它,要是安顿文件里不曾显式定义,则框架使用根日志中定义的性质。root成分没有质量。
扶助的子成分:

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

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

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

log4net.Config.XmlConfigurator.Configure();

4.1.2 <root>

实质上正是一个根logger,全体别的logger都暗中认可继承它,若是安顿文件里未有显式定义,则框架使用根日志中定义的属性。root元素未有质量。

支撑的子成分:

appender-ref

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

level

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

param

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

 

4.1.2 <root>

骨子里正是二个根logger,全部别的logger都暗中同意继承它,假设陈设文件里从未显式定义,则框架使用根日志中定义的习性。root成分未有质量。

支撑的子成分:

appender-ref

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

level

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

param

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

 

3.1.3 <logger>

帮助的习性:

name
必须的,logger的名称

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

协助的子成分:

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

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

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

1经是BS程序,在根目录的Global.asax.cs(未有新建三个)中的Application_Start方法中拉长:

4.1.3 <logger>

支撑的质量:

name

必须的,logger的名称

additivity

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

支撑的子成分:

appender-ref

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

level

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

param

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

 

4.1.3 <logger>

帮衬的本性:

name

必须的,logger的名称

additivity

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

资助的子成分:

appender-ref

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

level

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

param

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

 

3.1.4 <appender>

概念日志的出口形式,只可以当做 log四net
的子成分。name属性必须唯一,type属性必须内定。
援助的性质:

name
必须的,Appender对象的名称

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

支撑的子成分:

appender-ref
0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。

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

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

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

实际<appender>所能包罗的子成分远不止上面两个。

log4net.Config.XmlConfigurator.Configure();

4.1.4 <appender>

概念日志的出口形式,只好当作 log肆net 的子成分。name属性必须唯壹,type属性必须钦定。

援助的性质:

name

必须的,Appender对象的名称

type

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

扶助的子成分:

appender-ref

0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。

filter

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

layout

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

param

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

骨子里<appender>所能蕴涵的子成分远不止上边6个。

 

4.1.4 <appender>

概念日志的出口格局,只好当做 log四net 的子成分。name属性必须唯一,type属性必须钦命。

帮助的性质:

name

必须的,Appender对象的名称

type

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

扶助的子元素:

appender-ref

0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。

filter

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

layout

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

param

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

其实<appender>所能包含的子成分远不止上边四个。

 

3.1.5 <layout>

布局,只可以当做<appender>的子成分。
支撑的性能:

type
必须的,Layout的类型

支撑的子成分:

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

任凭BS照旧CS程序都可直接在品种的AssemblyInfo.cs文件里增加以下的语句:

4.1.5 <layout>

布局,只可以当作<appender>的子成分。

支撑的质量:

type

必须的,Layout的类型

协理的子成分:

param

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

 

4.1.5 <layout>

布局,只好当做<appender>的子成分。

接济的性质:

type

必须的,Layout的类型

补助的子成分:

param

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

 

3.1.6 <filter>

过滤器,只可以当做<appender>的子成分。

辅助的性质:

type
必须的,Filter的类型

补助的子成分:

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

[assembly: log4net.Config .XmlConfigurator()]

4.1.6 <filter>

过滤器,只可以当做<appender>的子成分。

接济的习性:

type

必须的,Filter的类型

支撑的子成分:

param

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

 

4.1.6 <filter>

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

支撑的习性:

type

必须的,Filter的类型

支撑的子成分:

param

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

 

3.1.7 <param>

<param>元素得以是其余因素的子成分。
支撑的特性:

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

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

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

支撑的子成分:

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

    第五步、声Bellamy(Bellamy)个日记容器

4.1.7 <param>

<param>成分得以是任何因素的子成分。

支撑的习性:

name

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

value

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

type

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

支撑的子成分:

param

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

 

4.1.7 <param>

<param>元素得以是任何因素的子成分。

支撑的习性:

name

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

value

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

type

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

支撑的子成分:

param

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

 

3.2 <appender>配置

<appender>在布署文件中足足有1个,也能够有多个,有些<appender>类型仍是能够引用其余<appender>类型,具体参数可参见上表。

上面只对写入回滚文件与出口到数据库(那里运用SQL数据库)配置体会说一下,其余安顿可参考官方网址:http://logging.apache.org/log4net/release/config-examples.html

   
 威尼斯人线上娱乐 3

4.2 <appender>配置

   <appender>在布署文件中至少有三个,也能够有多少个,某些<appender>类型还是可以够引用其余<appender>类型,具体参数可参见上表。

上面只对写入回滚文件与出口到数据库(那里运用SQL数据库)配置体会说一下,别的计划可参考官方网址:

4.2 <appender>配置

   <appender>在配置文件中至少有2个,也可以有多少个,有个别<appender>类型还是能够引用别的<appender>类型,具体参数可参见上表。

上面只对写入回滚文件与出口到数据库(那里运用SQL数据库)配置体会说一下,其余布置可参考官方网址:

叁.二.一写入回滚文件

<appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">

<!--日志文件路径,“/”与“/”作用相同,到达的目录相同,文件夹不存在则新建 -->

<!--按文件大小方式输出时在这里指定文件名,并且当天的日志在下一天时在文件名后自动追加当天日期形成新文件。-->

<!—按照日期形式输出时,直接连接元素DatePattern的value形成文件路径。此处使用这种方式 -->

<!--param的名称,可以直接查对应的appender类的属性名即可,这里要查的就是RollingFileAppender类的属性 -->

      <param name="File" value="D:/Log/" />

      <!--是否追加到文件-->

      <param name="AppendToFile" value="true" />

      <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->

      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

      <!—使用Unicode编码-->

      <Encoding value="UTF-8" />

      <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->

      <param name="MaxSizeRollBackups" value="10" />

      <!--是否只写到一个文件中-->

      <param name="StaticLogFileName" value="false" />

      <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->

      <param name="RollingStyle" value="Composite" />

      <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->

<!—此处按日期产生文件夹,文件名固定。注意&quot; 的位置-->

      <param name="DatePattern" value="yyyy-MM-dd/&quot;ReflectionLayout.log&quot;"  />

<!—这是按日期产生文件夹,并在文件名前也加上日期-->

      <param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-TimerServer.log&quot;"  />

<!—这是先按日期产生文件夹,再形成下一级固定的文件夹—>

      <param name="DatePattern" value="yyyyMMdd/&quot;TimerServer/TimerServer.log&quot;"  />

      <!--每个文件的大小。只在混合方式与文件大小方式下使用。

超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。

可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->

      <param name="maximumFileSize" value="500KB" />

<!--计数类型为1,2,3…-->
      <param name="CountDirection" value="1"/>

<!—过滤设置,LevelRangeFilter为使用的过滤器。 -->

      <filter type="log4net.Filter.LevelRangeFilter">

        <param name="LevelMin" value="DEBUG" />

        <param name="LevelMax" value="WARN" />

      </filter>

      <!--记录的格式。一般用log4net.Layout.**PatternLayout**布局-->

<!—此处用继承了log4net.Layout.**PatternLayout**的自定义布局,TGLog.ExpandLayout2为命名空间。%property{Operator}、%property{Action}是自定义的输出-->
      <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
        <param name="ConversionPattern"
 value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger     操作者ID:%property{Operator} 操作类型:%property{Action}%n             当前机器名:%property%n当前机器名及登录用户:%username %n               记录位置:%location%n 消息描述:%property{Message}%n                    异常:%exception%n 消息:%message%newline%n%n" />
      </layout>
</appender>

留神这一个配置属性某些是可选的,如若急需,一定要写正确,不然如故输出的不是温馨想要的结果,要么干脆不出口任何消息。

      
作者在配备文件中是这般设置的:威尼斯人线上娱乐 4

4.贰.1写入回滚文件

  1  <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
  2 
  3 <!--日志文件路径,“/”与“/”作用相同,到达的目录相同,文件夹不存在则新建 -->
  4 
  5 <!--按文件大小方式输出时在这里指定文件名,并且当天的日志在下一天时在文件名后自动追加当天日期形成新文件。-->
  6 
  7 <!—按照日期形式输出时,直接连接元素DatePattern的value形成文件路径。此处使用这种方式 -->
  8 
  9 <!--param的名称,可以直接查对应的appender类的属性名即可,这里要查的就是RollingFileAppender类的属性 -->
 10 
 11       <param name="File" value="D:/Log/" />
 12 
 13  
 14 
 15       <!--是否追加到文件-->
 16 
 17       <param name="AppendToFile" value="true" />
 18 
 19  
 20 
 21       <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
 22 
 23       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 24 
 25  
 26 
 27       <!—使用Unicode编码-->
 28 
 29       <Encoding value="UTF-8" />
 30 
 31  
 32 
 33       <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
 34 
 35       <param name="MaxSizeRollBackups" value="10" />
 36 
 37  
 38 
 39       <!--是否只写到一个文件中-->
 40 
 41       <param name="StaticLogFileName" value="false" />
 42 
 43  
 44 
 45       <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
 46 
 47       <param name="RollingStyle" value="Composite" />
 48 
 49  
 50 
 51       <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
 52 
 53 <!—此处按日期产生文件夹,文件名固定。注意&quot; 的位置-->
 54 
 55       <param name="DatePattern" value="yyyy-MM-dd/&quot;ReflectionLayout.log&quot;"  />
 56 
 57 <!—这是按日期产生文件夹,并在文件名前也加上日期-->
 58 
 59       <param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-TimerServer.log&quot;"  />
 60 
 61 <!—这是先按日期产生文件夹,再形成下一级固定的文件夹—>
 62 
 63       <param name="DatePattern" value="yyyyMMdd/&quot;TimerServer/TimerServer.log&quot;"  />
 64 
 65  
 66 
 67       <!--每个文件的大小。只在混合方式与文件大小方式下使用。
 68 
 69 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。
 70 
 71 可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
 72 
 73       <param name="maximumFileSize" value="500KB" />
 74 
 75  
 76 
 77 <!--计数类型为1,2,3…-->
 78       <param name="CountDirection" value="1"/>
 79 
 80  
 81 
 82 <!—过滤设置,LevelRangeFilter为使用的过滤器。 -->
 83 
 84       <filter type="log4net.Filter.LevelRangeFilter">
 85 
 86         <param name="LevelMin" value="DEBUG" />
 87 
 88         <param name="LevelMax" value="WARN" />
 89 
 90       </filter>
 91 
 92  
 93 
 94       <!--记录的格式。一般用log4net.Layout.PatternLayout布局-->
 95 
 96 <!—此处用继承了log4net.Layout.PatternLayout的自定义布局,TGLog.ExpandLayout2
 97 
 98 为命名空间。%property{Operator}、%property{Action}是自定义的输出-->
 99 
100       <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
101 
102         <param name="ConversionPattern"
103 
104  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger     操作者ID:%property{Operator} 操作类型:%property{Action}%n             当前机器名:%property%n当前机器名及登录用户:%username %n               记录位置:%location%n 消息描述:%property{Message}%n                    异常:%exception%n 消息:%message%newline%n%n" />
105 
106       </layout>
107 
108 </appender>

四.二.一写入回滚文件

  1  <appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
  2 
  3 <!--日志文件路径,“/”与“/”作用相同,到达的目录相同,文件夹不存在则新建 -->
  4 
  5 <!--按文件大小方式输出时在这里指定文件名,并且当天的日志在下一天时在文件名后自动追加当天日期形成新文件。-->
  6 
  7 <!—按照日期形式输出时,直接连接元素DatePattern的value形成文件路径。此处使用这种方式 -->
  8 
  9 <!--param的名称,可以直接查对应的appender类的属性名即可,这里要查的就是RollingFileAppender类的属性 -->
 10 
 11       <param name="File" value="D:/Log/" />
 12 
 13  
 14 
 15       <!--是否追加到文件-->
 16 
 17       <param name="AppendToFile" value="true" />
 18 
 19  
 20 
 21       <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
 22 
 23       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 24 
 25  
 26 
 27       <!—使用Unicode编码-->
 28 
 29       <Encoding value="UTF-8" />
 30 
 31  
 32 
 33       <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
 34 
 35       <param name="MaxSizeRollBackups" value="10" />
 36 
 37  
 38 
 39       <!--是否只写到一个文件中-->
 40 
 41       <param name="StaticLogFileName" value="false" />
 42 
 43  
 44 
 45       <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
 46 
 47       <param name="RollingStyle" value="Composite" />
 48 
 49  
 50 
 51       <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
 52 
 53 <!—此处按日期产生文件夹,文件名固定。注意&quot; 的位置-->
 54 
 55       <param name="DatePattern" value="yyyy-MM-dd/&quot;ReflectionLayout.log&quot;"  />
 56 
 57 <!—这是按日期产生文件夹,并在文件名前也加上日期-->
 58 
 59       <param name="DatePattern" value="yyyyMMdd/yyyyMMdd&quot;-TimerServer.log&quot;"  />
 60 
 61 <!—这是先按日期产生文件夹,再形成下一级固定的文件夹—>
 62 
 63       <param name="DatePattern" value="yyyyMMdd/&quot;TimerServer/TimerServer.log&quot;"  />
 64 
 65  
 66 
 67       <!--每个文件的大小。只在混合方式与文件大小方式下使用。
 68 
 69 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。
 70 
 71 可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
 72 
 73       <param name="maximumFileSize" value="500KB" />
 74 
 75  
 76 
 77 <!--计数类型为1,2,3…-->
 78       <param name="CountDirection" value="1"/>
 79 
 80  
 81 
 82 <!—过滤设置,LevelRangeFilter为使用的过滤器。 -->
 83 
 84       <filter type="log4net.Filter.LevelRangeFilter">
 85 
 86         <param name="LevelMin" value="DEBUG" />
 87 
 88         <param name="LevelMax" value="WARN" />
 89 
 90       </filter>
 91 
 92  
 93 
 94       <!--记录的格式。一般用log4net.Layout.PatternLayout布局-->
 95 
 96 <!—此处用继承了log4net.Layout.PatternLayout的自定义布局,TGLog.ExpandLayout2
 97 
 98 为命名空间。%property{Operator}、%property{Action}是自定义的输出-->
 99 
100       <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
101 
102         <param name="ConversionPattern"
103 
104  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger     操作者ID:%property{Operator} 操作类型:%property{Action}%n             当前机器名:%property%n当前机器名及登录用户:%username %n               记录位置:%location%n 消息描述:%property{Message}%n                    异常:%exception%n 消息:%message%newline%n%n" />
105 
106       </layout>
107 
108 </appender>

3.2.2写入SQL数据库

急需在对应的数据库中准备好一张表,创制语句如下:

CREATE TABLE [Log] (

[ID] [int] IDENTITY (1, 1) NOT NULL ,

[Date] [datetime] NOT NULL ,

[Thread] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Level] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Logger] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,

[Operator] [int] NULL ,

[Message] [text] COLLATE Chinese_PRC_CI_AS NULL ,

[ActionType] [int] NULL ,

[Operand] [varchar] (300) COLLATE Chinese_PRC_CI_AS NULL ,

[IP] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,

[MachineName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

[Browser] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

[Location] [text] COLLATE Chinese_PRC_CI_AS NULL ,

[Exception] [text] COLLATE Chinese_PRC_CI_AS NULL

)

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender,log4net">

<!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->

<bufferSize value="10" /><!—或写为<param name="BufferSize" value="10" />-->

<!--引用-->

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

<!--连接数据库字符串-->

<connectionString value="data source=.;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=;" />

<!--插入到表Log-->

<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Operator],[Message],[ActionType],[Operand],[IP],[MachineName],[Browser],[Location],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@operator, @message,@action_type,@operand,@ip,@machineName,@browser,@location,@exception)" />

<!—日志记录时间,**RawTimeStampLayout**为默认的时间输出格式 -->

      <parameter>

        <parameterName value="@log_date" />

        <dbType value="DateTime" />

        <layout type="log4net.Layout.**RawTimeStampLayout**" />

      </parameter>

      <!--线程号-->

      <parameter>

        <parameterName value="@thread" />

        <dbType value="String" />

<!—长度不可以省略,否则不会输出-->

        <size value="100" />

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

          <conversionPattern value="%thread" />

        </layout>

      </parameter>

      <!--日志等级-->

      <parameter>

        <parameterName value="@log_level" />

        <dbType value="String" />

        <size value="100" />

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

          <conversionPattern value="%level" />

        </layout>

      </parameter>

      <!--日志记录类名称-->

      <parameter>

        <parameterName value="@logger" />

        <dbType value="String" />

        <size value="200" />

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

          <conversionPattern value="%logger" />

        </layout>

      </parameter>

      <!--操作者。这个是自定义的输出字段,使用重新实现的布局器ReflectionLayout -->

      <parameter>

        <parameterName value="@operator" />

<!—设置为Int32时只有bufferSize的 value<="1"才正确输出,没有找出原因。-->

        <dbType value="Int16" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{Operator}" />

        </layout>

      </parameter>

      <!--操作对象-->

      <parameter>

        <parameterName value="@operand" />

        <dbType value="String" />

        <size value="300" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{Operand}" />

        </layout>

      </parameter>

      <!—IP地址-->

      <parameter>

        <parameterName value="@ip" />

        <dbType value="String" />

        <size value="20" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{IP}" />

        </layout>

      </parameter>

      <!--机器名-->

      <parameter>

        <parameterName value="@machineName" />

        <dbType value="String" />

        <size value="100" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{MachineName}" />

        </layout>

      </parameter>

      <!--浏览器-->

      <parameter>

        <parameterName value="@browser" />

        <dbType value="String" />

        <size value="50" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{Browser}" />

        </layout>

      </parameter>

      <!—日志消息-->

      <parameter>

        <parameterName value="@message" />

        <dbType value="String" />

        <size value="3000" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{Message}" />

        </layout>

      </parameter>

      <!--动作类型-->

      <parameter>

        <parameterName value="@action_type" />

        <dbType value="Int16" />

        <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">

          <conversionPattern value="%property{ActionType}" />

        </layout>

      </parameter>

      <!—记录日志的位置-->

      <parameter>

        <parameterName value="@location" />

        <dbType value="String" />

        <size value="2000" />

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

          <conversionPattern value="%location" />

        </layout>

      </parameter>

      <!—异常信息。ExceptionLayout 为异常输出的默认格式-->

      <parameter>

        <parameterName value="@exception" />

        <dbType value="String" />

        <size value="4000" />

        <layout type="log4net.Layout.ExceptionLayout" />

      </parameter>

</appender>

注意:

向表中输出的字段不能够多于数据表本身字段,而反之则足以,但这个多余字段一定使其得以为空,不然便写不到数据库;

出口字段的种类一定是对应数据表字段数据类型能够隐式转换的,而且长度也不能够当先,不然也无法写入;

数量表字段设置尽量能够为空,那样能够制止一条日志记录存在空数据造成后边的日记都记录不断。

   第五步、在先后中动用

4.2.1写入SQL数据库

须要在相应的数据库中准备好一张表,创造语句如下:

 1 CREATE TABLE [Log] (
 2 
 3 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 4 
 5 [Date] [datetime] NOT NULL ,
 6 
 7 [Thread] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 8 
 9 [Level] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
10 
11 [Logger] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
12 
13 [Operator] [int] NULL ,
14 
15 [Message] [text] COLLATE Chinese_PRC_CI_AS NULL ,
16 
17 [ActionType] [int] NULL ,
18 
19 [Operand] [varchar] (300) COLLATE Chinese_PRC_CI_AS NULL ,
20 
21 [IP] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
22 
23 [MachineName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
24 
25 [Browser] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
26 
27 [Location] [text] COLLATE Chinese_PRC_CI_AS NULL ,
28 
29 [Exception] [text] COLLATE Chinese_PRC_CI_AS NULL
30 
31 )

  1 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender,log4net">
  2 
  3 <!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
  4 
  5 <bufferSize value="10" /><!—或写为<param name="BufferSize" value="10" />-->
  6 
  7  
  8 
  9 <!--引用-->
 10 
 11 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
 12 
 13  
 14 
 15 <!--连接数据库字符串-->
 16 
 17 <connectionString value="data source=.;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=;" />
 18 
 19  
 20 
 21 <!--插入到表Log-->
 22 
 23 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Operator],[Message],[ActionType],[Operand],[IP],[MachineName],[Browser],[Location],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@operator, @message,@action_type,@operand,@ip,@machineName,@browser,@location,@exception)" />
 24 
 25  
 26 
 27 <!—日志记录时间,RawTimeStampLayout为默认的时间输出格式 -->
 28 
 29       <parameter>
 30 
 31         <parameterName value="@log_date" />
 32 
 33         <dbType value="DateTime" />
 34 
 35         <layout type="log4net.Layout.RawTimeStampLayout" />
 36 
 37       </parameter>
 38 
 39  
 40 
 41       <!--线程号-->
 42 
 43       <parameter>
 44 
 45         <parameterName value="@thread" />
 46 
 47         <dbType value="String" />
 48 
 49 <!—长度不可以省略,否则不会输出-->
 50 
 51         <size value="100" />
 52 
 53         <layout type="log4net.Layout.PatternLayout">
 54 
 55           <conversionPattern value="%thread" />
 56 
 57         </layout>
 58 
 59       </parameter>
 60 
 61  
 62 
 63       <!--日志等级-->
 64 
 65       <parameter>
 66 
 67         <parameterName value="@log_level" />
 68 
 69         <dbType value="String" />
 70 
 71         <size value="100" />
 72 
 73         <layout type="log4net.Layout.PatternLayout">
 74 
 75           <conversionPattern value="%level" />
 76 
 77         </layout>
 78 
 79       </parameter>
 80 
 81  
 82 
 83       <!--日志记录类名称-->
 84 
 85       <parameter>
 86 
 87         <parameterName value="@logger" />
 88 
 89         <dbType value="String" />
 90 
 91         <size value="200" />
 92 
 93         <layout type="log4net.Layout.PatternLayout">
 94 
 95           <conversionPattern value="%logger" />
 96 
 97         </layout>
 98 
 99       </parameter>
100 
101      
102 
103       <!--操作者。这个是自定义的输出字段,使用重新实现的布局器ReflectionLayout -->
104 
105       <parameter>
106 
107         <parameterName value="@operator" />
108 
109 <!—设置为Int32时只有bufferSize的 value<="1"才正确输出,没有找出原因。-->
110 
111         <dbType value="Int16" />
112 
113         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
114 
115           <conversionPattern value="%property{Operator}" />
116 
117         </layout>
118 
119       </parameter>
120 
121  
122 
123       <!--操作对象-->
124 
125       <parameter>
126 
127         <parameterName value="@operand" />
128 
129         <dbType value="String" />
130 
131         <size value="300" />
132 
133         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
134 
135           <conversionPattern value="%property{Operand}" />
136 
137         </layout>
138 
139       </parameter>
140 
141  
142 
143       <!—IP地址-->
144 
145       <parameter>
146 
147         <parameterName value="@ip" />
148 
149         <dbType value="String" />
150 
151         <size value="20" />
152 
153         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
154 
155           <conversionPattern value="%property{IP}" />
156 
157         </layout>
158 
159       </parameter>
160 
161  
162 
163       <!--机器名-->
164 
165       <parameter>
166 
167         <parameterName value="@machineName" />
168 
169         <dbType value="String" />
170 
171         <size value="100" />
172 
173         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
174 
175           <conversionPattern value="%property{MachineName}" />
176 
177         </layout>
178 
179       </parameter>
180 
181  
182 
183       <!--浏览器-->
184 
185       <parameter>
186 
187         <parameterName value="@browser" />
188 
189         <dbType value="String" />
190 
191         <size value="50" />
192 
193         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
194 
195           <conversionPattern value="%property{Browser}" />
196 
197         </layout>
198 
199       </parameter>
200 
201      
202 
203       <!—日志消息-->
204 
205       <parameter>
206 
207         <parameterName value="@message" />
208 
209         <dbType value="String" />
210 
211         <size value="3000" />
212 
213         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
214 
215           <conversionPattern value="%property{Message}" />
216 
217         </layout>
218 
219       </parameter>
220 
221  
222 
223       <!--动作类型-->
224 
225       <parameter>
226 
227         <parameterName value="@action_type" />
228 
229         <dbType value="Int16" />
230 
231         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
232 
233           <conversionPattern value="%property{ActionType}" />
234 
235         </layout>
236 
237       </parameter>
238 
239  
240 
241       <!—记录日志的位置-->
242 
243       <parameter>
244 
245         <parameterName value="@location" />
246 
247         <dbType value="String" />
248 
249         <size value="2000" />
250 
251         <layout type="log4net.Layout.PatternLayout">
252 
253           <conversionPattern value="%location" />
254 
255         </layout>
256 
257       </parameter>
258 
259      
260 
261       <!—异常信息。ExceptionLayout 为异常输出的默认格式-->
262 
263       <parameter>
264 
265         <parameterName value="@exception" />
266 
267         <dbType value="String" />
268 
269         <size value="4000" />
270 
271         <layout type="log4net.Layout.ExceptionLayout" />
272 
273       </parameter>
274 
275 </appender>

注意:

向表中输出的字段不可能多于数据表本人字段,而反之则足以,但那么些剩余字段一定使其能够为空,不然便写不到数据库;

输出字段的项目一定是对应数据表字段数据类型能够隐式转换的,而且长度也无法跨越,不然也不能够写入;

数据表字段设置尽量能够为空,那样可防止止一条日志记录存在空数据造成后边的日记都记录不断。

4.2.1写入SQL数据库

需求在相应的数据库中准备好一张表,成立语句如下:

 1 CREATE TABLE [Log] (
 2 
 3 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 4 
 5 [Date] [datetime] NOT NULL ,
 6 
 7 [Thread] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 8 
 9 [Level] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
10 
11 [Logger] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
12 
13 [Operator] [int] NULL ,
14 
15 [Message] [text] COLLATE Chinese_PRC_CI_AS NULL ,
16 
17 [ActionType] [int] NULL ,
18 
19 [Operand] [varchar] (300) COLLATE Chinese_PRC_CI_AS NULL ,
20 
21 [IP] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
22 
23 [MachineName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
24 
25 [Browser] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
26 
27 [Location] [text] COLLATE Chinese_PRC_CI_AS NULL ,
28 
29 [Exception] [text] COLLATE Chinese_PRC_CI_AS NULL
30 
31 )

  1 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender,log4net">
  2 
  3 <!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
  4 
  5 <bufferSize value="10" /><!—或写为<param name="BufferSize" value="10" />-->
  6 
  7  
  8 
  9 <!--引用-->
 10 
 11 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
 12 
 13  
 14 
 15 <!--连接数据库字符串-->
 16 
 17 <connectionString value="data source=.;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=;" />
 18 
 19  
 20 
 21 <!--插入到表Log-->
 22 
 23 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Operator],[Message],[ActionType],[Operand],[IP],[MachineName],[Browser],[Location],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@operator, @message,@action_type,@operand,@ip,@machineName,@browser,@location,@exception)" />
 24 
 25  
 26 
 27 <!—日志记录时间,RawTimeStampLayout为默认的时间输出格式 -->
 28 
 29       <parameter>
 30 
 31         <parameterName value="@log_date" />
 32 
 33         <dbType value="DateTime" />
 34 
 35         <layout type="log4net.Layout.RawTimeStampLayout" />
 36 
 37       </parameter>
 38 
 39  
 40 
 41       <!--线程号-->
 42 
 43       <parameter>
 44 
 45         <parameterName value="@thread" />
 46 
 47         <dbType value="String" />
 48 
 49 <!—长度不可以省略,否则不会输出-->
 50 
 51         <size value="100" />
 52 
 53         <layout type="log4net.Layout.PatternLayout">
 54 
 55           <conversionPattern value="%thread" />
 56 
 57         </layout>
 58 
 59       </parameter>
 60 
 61  
 62 
 63       <!--日志等级-->
 64 
 65       <parameter>
 66 
 67         <parameterName value="@log_level" />
 68 
 69         <dbType value="String" />
 70 
 71         <size value="100" />
 72 
 73         <layout type="log4net.Layout.PatternLayout">
 74 
 75           <conversionPattern value="%level" />
 76 
 77         </layout>
 78 
 79       </parameter>
 80 
 81  
 82 
 83       <!--日志记录类名称-->
 84 
 85       <parameter>
 86 
 87         <parameterName value="@logger" />
 88 
 89         <dbType value="String" />
 90 
 91         <size value="200" />
 92 
 93         <layout type="log4net.Layout.PatternLayout">
 94 
 95           <conversionPattern value="%logger" />
 96 
 97         </layout>
 98 
 99       </parameter>
100 
101      
102 
103       <!--操作者。这个是自定义的输出字段,使用重新实现的布局器ReflectionLayout -->
104 
105       <parameter>
106 
107         <parameterName value="@operator" />
108 
109 <!—设置为Int32时只有bufferSize的 value<="1"才正确输出,没有找出原因。-->
110 
111         <dbType value="Int16" />
112 
113         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
114 
115           <conversionPattern value="%property{Operator}" />
116 
117         </layout>
118 
119       </parameter>
120 
121  
122 
123       <!--操作对象-->
124 
125       <parameter>
126 
127         <parameterName value="@operand" />
128 
129         <dbType value="String" />
130 
131         <size value="300" />
132 
133         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
134 
135           <conversionPattern value="%property{Operand}" />
136 
137         </layout>
138 
139       </parameter>
140 
141  
142 
143       <!—IP地址-->
144 
145       <parameter>
146 
147         <parameterName value="@ip" />
148 
149         <dbType value="String" />
150 
151         <size value="20" />
152 
153         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
154 
155           <conversionPattern value="%property{IP}" />
156 
157         </layout>
158 
159       </parameter>
160 
161  
162 
163       <!--机器名-->
164 
165       <parameter>
166 
167         <parameterName value="@machineName" />
168 
169         <dbType value="String" />
170 
171         <size value="100" />
172 
173         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
174 
175           <conversionPattern value="%property{MachineName}" />
176 
177         </layout>
178 
179       </parameter>
180 
181  
182 
183       <!--浏览器-->
184 
185       <parameter>
186 
187         <parameterName value="@browser" />
188 
189         <dbType value="String" />
190 
191         <size value="50" />
192 
193         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
194 
195           <conversionPattern value="%property{Browser}" />
196 
197         </layout>
198 
199       </parameter>
200 
201      
202 
203       <!—日志消息-->
204 
205       <parameter>
206 
207         <parameterName value="@message" />
208 
209         <dbType value="String" />
210 
211         <size value="3000" />
212 
213         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
214 
215           <conversionPattern value="%property{Message}" />
216 
217         </layout>
218 
219       </parameter>
220 
221  
222 
223       <!--动作类型-->
224 
225       <parameter>
226 
227         <parameterName value="@action_type" />
228 
229         <dbType value="Int16" />
230 
231         <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
232 
233           <conversionPattern value="%property{ActionType}" />
234 
235         </layout>
236 
237       </parameter>
238 
239  
240 
241       <!—记录日志的位置-->
242 
243       <parameter>
244 
245         <parameterName value="@location" />
246 
247         <dbType value="String" />
248 
249         <size value="2000" />
250 
251         <layout type="log4net.Layout.PatternLayout">
252 
253           <conversionPattern value="%location" />
254 
255         </layout>
256 
257       </parameter>
258 
259      
260 
261       <!—异常信息。ExceptionLayout 为异常输出的默认格式-->
262 
263       <parameter>
264 
265         <parameterName value="@exception" />
266 
267         <dbType value="String" />
268 
269         <size value="4000" />
270 
271         <layout type="log4net.Layout.ExceptionLayout" />
272 
273       </parameter>
274 
275 </appender>

注意:

向表中输出的字段不能够多于数据表本人字段,而反之则能够,但这一个剩余字段一定使其得以为空,不然便写不到数据库;

输出字段的档次一定是对应数据表字段数据类型能够隐式转换的,而且长度也不可能超过,否则也不能够写入;

数据表字段设置尽量能够为空,那样能够免止一条日志记录存在空数据造成前面包车型客车日志都记录不断。

3.3<logger>的配置

在配置文件<appender>中的配置好了出口的介质,格式,过滤形式,还要定义日志对象<logger>。

在框架的体系里,全数的日志对象都是根日志(root logger)的后代。
由此假使一个日记对象未有在配备文件里显式定义,则框架使用根日志中定义的性质。在<root>标签里,能够定义level级别值和Appender的列表。要是未有定义LEVEL的值,则缺省为DEBUG。能够经过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>注解了在任哪里方定义的Appender对象的1个引用。在一个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>

  威尼斯人线上娱乐 5

4.3<logger>的配置

在计划文件<appender>中的配置好了出口的介质,格式,过滤格局,还要定义日志对象<logger>。

在框架的系统里,全体的日记对象都以根日志(root
logger)的遗族。 由此假使三个日志对象未有在布局文件里显式定义,则框架使用根日志中定义的质量。在<root>标签里,能够定义level级别值和Appender的列表。就算未有定义LEVEL的值,则缺省为DEBUG。能够通过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>证明了在其它市方定义的Appender对象的1个引用。在三个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会一连父日志对象的Appender列表。这种缺省的一举一动艺术也得以透过显式地设定<logger>标签的additivity属性为false而更改。

<root>不显式注脚时使用默许的安排。作者觉着在采用时不定义<root>,自定义多少个<logger>,在程序中著录日志时一贯运用<logger>的name来探寻相应的<logger>,那样越来越灵活一些。例如:

<!–同时写七个公文和数据库–>

 1 <logger name="ReflectionLayout">
 2 
 3       <level value="DEBUG"/>
 4 
 5       <appender-ref ref="HashtableLayout"/>
 6 
 7       <appender-ref ref="ReflectionLayout"/>
 8 
 9       <appender-ref ref="ADONetAppender"/>
10 
11 </logger>

4.3<logger>的配置

在计划文件<appender>中的配置好了出口的介质,格式,过滤形式,还要定义日志对象<logger>。

在框架的体系里,全部的日志对象都以根日志(root
logger)的后裔。 由此倘诺1个日记对象未有在计划文件里显式定义,则框架使用根日志中定义的性质。在<root>标签里,能够定义level级别值和Appender的列表。假诺没有定义LEVEL的值,则缺省为DEBUG。能够经过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>证明了在任哪个地方方定义的Appender对象的八个引用。在3个logger对象中的设置会覆盖根日志的装置。而对Appender属性来说,子日志对象则会一而再父日志对象的Appender列表。那种缺省的表现格局也能够由此显式地设定<logger>标签的additivity属性为false而变更。

<root>不显式注解时利用暗中同意的安插。笔者认为在使用时不定义<root>,自定义八个<logger>,在程序中记录日志时直接采用<logger>的name来寻找相应的<logger>,那样更加灵活①些。例如:

<!–同时写多个文本和数据库–>

 1 <logger name="ReflectionLayout">
 2 
 3       <level value="DEBUG"/>
 4 
 5       <appender-ref ref="HashtableLayout"/>
 6 
 7       <appender-ref ref="ReflectionLayout"/>
 8 
 9       <appender-ref ref="ADONetAppender"/>
10 
11 </logger>

三.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](file://log4net.xml/)";

log4net.Config.XmlConfigurator.ConfigureAndWatch(

new FileInfo(configFilePath));

或直接利用绝对路径:

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

3、首要的组成都部队分

四.肆关乎配置文件

log四net默许关联的是应用程序的安顿文件App.config(BS程序是Web.config),能够应用程序集自定义属性来进展安装。上边来介绍一下这几个自定义属性:

log4net.Config.XmlConifguratorAttribute。 

XmlConfiguratorAttribute有3个属性:

ConfigFile: 配置文件的名字,文件路径绝对于应用程序目录

(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile属性不可能和ConfigFileExtension属性1起行使。

ConfigFileExtension: 配置文件的恢弘名,文件路径相对于应用程序的目录。ConfigFileExtension属性无法和ConfigFile属性一起利用。

沃特ch: 若是将沃特ch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会重复加载。

借使ConfigFile和ConfigFileExtension都未有安装,则应用应用程序的安排文件App.config(Web.config)。

能够在项指标AssemblyInfo.cs文件里丰富以下的语句:

 1  //监视默认的配置文件,App.exe.config   
 2 
 3 [assembly: log4net.Config.XmlConfigurator(Watch = true)]
 4 
 5  
 6 
 7 //监视配置文件,App.exe.log4net。
 8 
 9 [assembly: log4net. Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]
10 
11  
12 
13 //使用配置文件log4net.config,不监视改变。注意log4net.config文件的目录,BS程序在站点目录//下,CS则在应用程序启动目录下,如调试时在/bin/Debug下,一般将文件属性的文件输出目录调为//始终复制即可
14 
15 [assembly: log4net. Config.XmlConfigurator(ConfigFile = "log4net.config")]
16 
17  
18 
19 //使用配置文件log4net.config,不监视改变
20 
21 [assembly: log4net. Config.XmlConfigurator()]

也能够在Global.asax的Application_Start里只怕是Program.cs中的Main方法中添加,注意那里一定是相对路径,如下所示:

 1 //这是在BS程序下,使用自定义的配置文件log4net.xml,使用Server.MapPath("~") + //@"/log4net.xml”来取得路径。/log4net.xml为相对于站点的路径
 2 
 3 // ConfigureAndWatch()相当于Configure(Watch = true)
 4 
 5 log4net.Config.XmlConfigurator.ConfigureAndWatch(
 6 
 7 new System.IO.FileInfo(Server.MapPath("~") + @"/log4net.xml"));
 8 
 9 //这是在CS程序下,可以用以下方法获得:
10 
11 string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
12 
13 string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
14 
15 string configFilePath = assemblyDirPath + " //log4net.xml";
16 
17 log4net.Config.XmlConfigurator.ConfigureAndWatch(
18 
19 new FileInfo(configFilePath));

或直接使用相对路径:

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

四.4关联配置文件

log肆net暗中认可关联的是应用程序的陈设文件App.config(BS程序是Web.config),能够使用程序集自定义属性来进行设置。上边来介绍一下这些自定义属性:

log4net.Config.XmlConifguratorAttribute。 

XmlConfiguratorAttribute有3个属性:

ConfigFile: 配置文件的名字,文件路径相对于应用程序目录

(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile属性不可能和ConfigFileExtension属性一起行使。

ConfigFileExtension: 配置文件的扩充名,文件路径相对于应用程序的目录。ConfigFileExtension属性无法和ConfigFile属性一起利用。

沃特ch: 若是将沃特ch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会再一次加载。

假诺ConfigFile和ConfigFileExtension都未有设置,则动用应用程序的配备文件App.config(Web.config)。

能够在项指标AssemblyInfo.cs文件里丰裕以下的说话:

 1  //监视默认的配置文件,App.exe.config   
 2 
 3 [assembly: log4net.Config.XmlConfigurator(Watch = true)]
 4 
 5  
 6 
 7 //监视配置文件,App.exe.log4net。
 8 
 9 [assembly: log4net. Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]
10 
11  
12 
13 //使用配置文件log4net.config,不监视改变。注意log4net.config文件的目录,BS程序在站点目录//下,CS则在应用程序启动目录下,如调试时在/bin/Debug下,一般将文件属性的文件输出目录调为//始终复制即可
14 
15 [assembly: log4net. Config.XmlConfigurator(ConfigFile = "log4net.config")]
16 
17  
18 
19 //使用配置文件log4net.config,不监视改变
20 
21 [assembly: log4net. Config.XmlConfigurator()]

也能够在Global.asax的Application_Start里大概是Program.cs中的Main方法中加上,注意那里一定是相对路径,如下所示:

 1 //这是在BS程序下,使用自定义的配置文件log4net.xml,使用Server.MapPath("~") + //@"/log4net.xml”来取得路径。/log4net.xml为相对于站点的路径
 2 
 3 // ConfigureAndWatch()相当于Configure(Watch = true)
 4 
 5 log4net.Config.XmlConfigurator.ConfigureAndWatch(
 6 
 7 new System.IO.FileInfo(Server.MapPath("~") + @"/log4net.xml"));
 8 
 9 //这是在CS程序下,可以用以下方法获得:
10 
11 string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
12 
13 string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
14 
15 string configFilePath = assemblyDirPath + " //log4net.xml";
16 
17 log4net.Config.XmlConfigurator.ConfigureAndWatch(
18 
19 new FileInfo(configFilePath));

或直接行使相对路径:

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

四、怎么样记录日志

Log四net使用很便利,先表明一(Wissu)个封装类ILog 的靶子,如下:

log4net.ILog log = log4net.LogManager.GetLogger("ReflectionLayout");

里面”ReflectionLayout”就是大家自定义的日志对象<logger>的name的值。

对应5个日志输出级别,log有5 个主意,每一个方法都有多个重载,使用如下:

try
            {
                log.Debug("这是一个测试!");
            }

            catch(Exception ec)
            {
                log.Error("出现错误!", ec);
         }

原稿地址:http://www.cnblogs.com/zhangchenliang/p/4546352.html

             1.Appenders

5、怎么着记录日志

Log四net使用很有益于,先说雀巢个封装类ILog 的靶子,如下:

log4net.ILog log = log4net.LogManager.GetLogger(“ReflectionLayout”);

内部”ReflectionLayout”正是大家自定义的日记对象<logger>的name的值。

对应伍个日志输出级别,log有5 个法子,种种方法都有三个重载,使用如下:

 1         try
 2 
 3             {
 4 
 5                 log.Debug("这是一个测试!");
 6 
 7             }
 8 
 9             catch(Exception ec)
10 
11             {
12 
13                 log.Error("出现错误!", ec);
14 
15          }

设若大家要求输出的新闻是要分别开来,不按2个字符串全体输出,就须要开始展览局部扩充了。

5、怎样记录日志

Log肆net使用很有利,先说Bellamy个封装类ILog 的对象,如下:

log4net.ILog log = log4net.LogManager.GetLogger(“ReflectionLayout”);

里头”ReflectionLayout”正是大家自定义的日记对象<logger>的name的值。

对应四个日志输出级别,log有5 个章程,每种方法都有七个重载,使用如下:

 1         try
 2 
 3             {
 4 
 5                 log.Debug("这是一个测试!");
 6 
 7             }
 8 
 9             catch(Exception ec)
10 
11             {
12 
13                 log.Error("出现错误!", ec);
14 
15          }

借使大家必要输出的消息是要区分开来,不按三个字符串全体出口,就必要展开部分恢宏了。

参考

1、http://peibing211.blog.163.com/blog/static/37116360200992811595469/
2、http://www.cnblogs.com/qiangzi/archive/2009/09/10/1541023.html
3、http://blog.chinaunix.net/u/23701/showart\_1414206.html
4、http://itrust.cnblogs.com/archive/2005/01/25/97225.html
5、http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.aspx
6、http://www.cnblogs.com/zhmore/archive/2009/03/19/1416707.html
7、http://blog.shinylife.net/blog/article.asp?id=948
8、http://www.cnblogs.com/manhoo/archive/2009/06/25/1511066.html

              
Appenders用来定义日志的输出格局,即日志要写到那种介质上去。较常用的Log四net已经落到实处好了,直接在安排文件中调用即可,可参见上边配置文件例子;当然也能够协调写四个,必要从
     
log4net.Appender.AppenderSkeleton类继承。它还足以经过布署Filters和Layout来达成日志的过滤和输出格式。

6、Log肆net的简练扩展

六、Log四net的简约扩张

              已经完成的输出格局有:

陆.一通过重写布局Layout输出传入的 message对象的个性

6.1因此重写布局Layout输出传入的 message对象的性质

AdoNetAppender 将日志记录到数据库中。可以选拔SQL和储存进度二种方法。

6.1.1重写Layout类

透过一而再log四net.Layout.PatternLayout类,使用log四net.Core.Logging伊夫nt类的不贰秘诀获得了要出口的message类的名称,然后通过反射获得各类属性的值,使用PatternLayout类AddConverter方法传入得到的值。那里注意要引用用到的类的命名空间。

代码见附注八.2。

 

6.1.1重写Layout类

透过再三再四log四net.Layout.PatternLayout类,使用log四net.Core.Logging伊夫nt类的方式获得了要出口的message类的名称,然后通过反射获得各样属性的值,使用PatternLayout类AddConverter方法传入获得的值。那里注意要引用用到的类的命名空间。

代码见附注八.二。

 

AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。

陆.一.二布置相应的安顿文件

布局文件别的地点不用改动,只是须要转移<appender>中的<layout>。例如:

1 <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
2 
3         <param name="ConversionPattern"
4 
5  value="记录时间:%date    操作者ID:%property{Operator}             
6 
7 操作类型:%property{Action}%n  消息描述:%property{Message}%n                    异常:%exception%n " />
8 
9       </layout>

个中<layout>的type由原来的log四net.Layout.PatternLayout换为自定义的TGLog.ExpandLayout贰.ReflectionLayout(TGLog.ExpandLayout2为命名空间)。%property{Operator}输出的即为message类对象的性质Operator的值。数据库配置同样,相应的字段倘使是自定义的,则输出选取自定义的<layout>。例:

 1 <!--动作类型-->
 2 
 3   <parameter>
 4 
 5       <parameterName value="@action_type" />
 6 
 7       <dbType value="Int16" />
 8 
 9       <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
10 
11          <conversionPattern value="%property{ActionType}" />
12 
13       </layout>
14 
15   </parameter>

陆.1.贰配备相应的配备文件

布局文件其余地点不用改动,只是须要转移<appender>中的<layout>。例如:

1 <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
2 
3         <param name="ConversionPattern"
4 
5  value="记录时间:%date    操作者ID:%property{Operator}             
6 
7 操作类型:%property{Action}%n  消息描述:%property{Message}%n                    异常:%exception%n " />
8 
9       </layout>

里头<layout>的type由原先的log四net.Layout.PatternLayout换为自定义的TGLog.ExpandLayout二.ReflectionLayout(TGLog.ExpandLayout2为命名空间)。%property{Operator}输出的即为message类对象的属性Operator的值。数据库配置同样,相应的字段就算是自定义的,则输出接纳自定义的<layout>。例:

 1 <!--动作类型-->
 2 
 3   <parameter>
 4 
 5       <parameterName value="@action_type" />
 6 
 7       <dbType value="Int16" />
 8 
 9       <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
10 
11          <conversionPattern value="%property{ActionType}" />
12 
13       </layout>
14 
15   </parameter>

AspNetTraceAppender  能用asp.net中Trace的办法查看记录的日记。

6.壹.三主次中怎么着利用

和一般选取格局基本相同,只是传入的参数是二个自定义的类,类的性情和布局文件中<layout>全数的%property{属性}是同1的,即%property{属性}在出口的时候就寻找传入message类中有无对应的性质,假诺有就输出值,未有则输出null。例:

 1 log4net.ILog log = log4net.LogManager.GetLogger("ReflectionLayout");
 2 
 3 try
 4 
 5             {
 6 
 7                 log.Debug(new LogMessage(
 8 
 9 1,
10 
11 "操作对象:0",
12 
13  (int)TGLog.ActionType.Other,
14 
15  "这是四个参数测试")
16 
17 );
18 
19             }
20 
21             catch(Exception ec)
22 
23             {
24 
25                 log.Error(new LogMessage(
26 
27                                     1,
28 
29                                     "操作对象:0",
30 
31                                     (int)TGLog.ActionType.Other,
32 
33                                     "这是全部参数测试",
34 
35                                     "192.168.1.1",
36 
37                                     "MyComputer",
38 
39                                     "Maxthon(MyIE2)Fans"),
40 
41                          ec
42 
43 );
44 
45       }

LogMessage的全数性质的构造方法如下:

 1 public LogMessage(
 2 
 3             int operatorID,
 4 
 5             string operand,
 6 
 7             int ActionType,
 8 
 9             string message,
10 
11             string ip,
12 
13             string machineName,
14 
15             string browser
16 
17             )
18 
19      {
20 
21             this.ActionType = ActionType;
22 
23             this.Operator = operatorID;
24 
25             this.Message = message;
26 
27             this.Operand = operand;
28 
29             this.IP = ip;
30 
31             this.Browser = browser;
32 
33             this.MachineName = machineName;
34 
35 }

陆.一.3先后中怎样利用

和一般采用格局基本相同,只是传入的参数是一个自定义的类,类的天性和配备文件中<layout>全体的%property{属性}是1致的,即%property{属性}在输出的时候就寻找传入message类中有无对应的性质,若是有就输出值,未有则输出null。例:

 1 log4net.ILog log = log4net.LogManager.GetLogger("ReflectionLayout");
 2 
 3 try
 4 
 5             {
 6 
 7                 log.Debug(new LogMessage(
 8 
 9 1,
10 
11 "操作对象:0",
12 
13  (int)TGLog.ActionType.Other,
14 
15  "这是四个参数测试")
16 
17 );
18 
19             }
20 
21             catch(Exception ec)
22 
23             {
24 
25                 log.Error(new LogMessage(
26 
27                                     1,
28 
29                                     "操作对象:0",
30 
31                                     (int)TGLog.ActionType.Other,
32 
33                                     "这是全部参数测试",
34 
35                                     "192.168.1.1",
36 
37                                     "MyComputer",
38 
39                                     "Maxthon(MyIE2)Fans"),
40 
41                          ec
42 
43 );
44 
45       }

LogMessage的方方面面质量的构造方法如下:

 1 public LogMessage(
 2 
 3             int operatorID,
 4 
 5             string operand,
 6 
 7             int ActionType,
 8 
 9             string message,
10 
11             string ip,
12 
13             string machineName,
14 
15             string browser
16 
17             )
18 
19      {
20 
21             this.ActionType = ActionType;
22 
23             this.Operator = operatorID;
24 
25             this.Message = message;
26 
27             this.Operand = operand;
28 
29             this.IP = ip;
30 
31             this.Browser = browser;
32 
33             this.MachineName = machineName;
34 
35 }

BufferingForwardingAppender 在出口到子Appenders在此之前先缓存日志事件。

六.2通过重新完毕ILog接口来充实输入的参数

6.2因而重复达成ILog接口来充实输入的参数

ConsoleAppender 将日志输出到应用程控台。

六.贰.一重写LogImpl,LogManager类及完成ILog接口

那种方法是因而协会一个名称叫IMyLog接口,是继承Ilog接口而来,然后分别在MyLogImpl,MyLogManager再次达成IMyLog接口,扩充了各类办法的参数。MyLogImpl,MyLogManager各自继承LogImpl,LogManager而来。

代码分别见八.三、八.肆、八.五:

陆.二.壹重写LogImpl,LogManager类及实现ILog接口

那种方式是经过组织五个名字为IMyLog接口,是继承Ilog接口而来,然后分别在MyLogImpl,MyLogManager重复实现IMyLog接口,扩展了每个情势的参数。MyLogImpl,MyLogManager各自继承LogImpl,LogManager而来。

代码分别见八.三、八.肆、8.5:

伊夫ntLogAppender 将日志写到Windows 伊夫nt Log。

6.二.二铺排相应的布局文件

配备文件别的地方不用改动,只是供给转移<appender>中的<layout>成分name为ConversionPattern的value中输出格式。例如:

1 <layout type=" log4net.Layout.PatternLayout ">
2 
3         <param name="ConversionPattern"
4 
5  value="记录时间:%date    操作者ID:%property{Operator}             
6 
7 操作类型:%property{Action}%n  消息描述:%property{Message}%n                    异常:%exception%n " />
8 
9       </layout>

%property{参数}中的参数在MyLogImpl类中定义,如语句:

loggingEvent.Properties[“Operator”] = operatorID;

就定义了Operator输出参数,即%property{Operator}输出的即为IMyLog中的参数operatorID的值。

数据库配置同样。例:

 1 <!--动作类型-->
 2 
 3   <parameter>
 4 
 5       <parameterName value="@action_type" />
 6 
 7       <dbType value="Int16" />
 8 
 9       <layout type=" log4net.Layout.PatternLayout ">
10 
11          <conversionPattern value="%property{ActionType}" />
12 
13       </layout>
14 
15   </parameter>

陆.2.2布局相应的布局文件

配备文件别的地点不用改动,只是需求转移<appender>中的<layout>成分name为ConversionPattern的value中输出格式。例如:

1 <layout type=" log4net.Layout.PatternLayout ">
2 
3         <param name="ConversionPattern"
4 
5  value="记录时间:%date    操作者ID:%property{Operator}             
6 
7 操作类型:%property{Action}%n  消息描述:%property{Message}%n                    异常:%exception%n " />
8 
9       </layout>

%property{参数}中的参数在MyLogImpl类中定义,如语句:

loggingEvent.Properties[“Operator”] = operatorID;

就定义了Operator输出参数,即%property{Operator}输出的即为IMyLog中的参数operatorID的值。

数据库配置同样。例:

 1 <!--动作类型-->
 2 
 3   <parameter>
 4 
 5       <parameterName value="@action_type" />
 6 
 7       <dbType value="Int16" />
 8 
 9       <layout type=" log4net.Layout.PatternLayout ">
10 
11          <conversionPattern value="%property{ActionType}" />
12 
13       </layout>
14 
15   </parameter>

FileAppender 将日志输出到文件。

陆.2.叁顺序中什么运用

先引用IMyLog ,MyLogManager所在的命名空间,创造3个IMyLog对象,myLog的5 个格局,各类方法都有七个重载,增添了多参数的重载。例:

 1 IMyLog myLog = MyLogManager.GetLogger("ExpandILog");
 2 
 3 try
 4 
 5             {
 6 
 7 myLog.Debug("这是一个参数重载测试!");          
 8 
 9 }
10 
11             catch(Exception ec)
12 
13             {
14 
15                 log.Error(
16 
17                           1,
18 
19                           "操作对象:0",
20 
21                           (int)TGLog.ActionType.Other,
22 
23                           "这是全部参数测试",
24 
25                           "192.168.1.1",
26 
27                           "MyComputer",
28 
29                           "Maxthon(MyIE2)Fans",
30 
31                           ec
32 
33 );
34 
35       }

陆.②.叁先后中如何使用

先引用IMyLog ,MyLogManager所在的命名空间,创制3个IMyLog对象,myLog的五 个方式,每一个方法都有多少个重载,扩充了多参数的重载。例:

 1 IMyLog myLog = MyLogManager.GetLogger("ExpandILog");
 2 
 3 try
 4 
 5             {
 6 
 7 myLog.Debug("这是一个参数重载测试!");          
 8 
 9 }
10 
11             catch(Exception ec)
12 
13             {
14 
15                 log.Error(
16 
17                           1,
18 
19                           "操作对象:0",
20 
21                           (int)TGLog.ActionType.Other,
22 
23                           "这是全部参数测试",
24 
25                           "192.168.1.1",
26 
27                           "MyComputer",
28 
29                           "Maxthon(MyIE2)Fans",
30 
31                           ec
32 
33 );
34 
35       }

ForwardingAppender 发送日志事件到子Appenders。

7、总结

Log四net 成效很多,那里只是对已经尝试用过的机能总计一下,普通写日记已经足足。需求注意的是:

1.            Log四net本人也有局地败笔,比如3个记录引起了log4net自身的万分,就会使后边的日记无法记录下来,特别是在写入数据库时。例如使用6.壹恢宏后,int型的品质在<appender >的要素<bufferSize>设置不为1时,<dbType value=”Int3二” />时,就不能出口到数据库,而<dbType value=”Int1六” />则没别的难点。

二.            Log四net自个儿出现了十分,比如配置文件出现错误,有些日记输出格局会记录下那么些尤其,例如应用程控台;有个别则不会输出那个错误,如数据库与公事。

三.            扩大时也会留给1些难题。例如在动用六.一扩张输出字段时就会油不过生,在log.debug(object
message)中,假如message是一个自定义的类,属性与布局文件中输出设置也一样,构造函数时也只构造一个参数的实例,写文件与写数据库都事业有成,而将message按未有扩充的艺术直接传入四个字符串,即log.debug(“新闻内容”)使用则不得不写入文件,而数据库则没写入。自定义的Layout 便是持续暗中同意的PatternLayout,本来不应当出错,但出现了难点。原因分析是自定义的message类有品种为int的性质,作为一个目的传入时在暗许值0,而直接使用字符串则int型的字段得不到暗许值,引发那些。所以提出在有扩大存在时,最广大设几个<logger>,区分清楚,依照联合的款型记录日志,不要混合使用。

四.            配置文件的装置一定要标准,在有些不科学就会造成日志无法正常输出,所以在安排时先从最简便的始发,同时输出情势选取一种能出口log四net本身13分的章程,成功后一点一点加在新安顿,这样出错了也不难找到相当地点安插有题目。

伍.            log4net扩大性很强,大约全体的零件都能够重写,在配备文件中配备好就能够选择。

7、总结

Log四net 成效很多,那里只是对曾经尝试用过的机能总结一下,普通写日记已经够用。要求注意的是:

一.            Log四net自身也有局地败笔,比如叁个记录引起了log四net本人的分外,就会使后边的日记不能记录下来,特别是在写入数据库时。例如使用6.一恢宏后,int型的品质在<appender >的因素<bufferSize>设置不为一时,<dbType value=”Int3二” />时,就无法出口到数据库,而<dbType value=”Int16″ />则没别的难点。

贰.            Log四net自身现身了10分,比如配置文件出现错误,有些日记输出形式会记录下这一个分外,例如应用程控台;有个别则不会输出这几个错误,如数据库与公事。

叁.            扩展时也会留给一些标题。例如在选择6.壹扩充输出字段时就会冒出,在log.debug(object
message)中,假诺message是1个自定义的类,属性与布局文件中输出设置也同等,构造函数时也只构造三个参数的实例,写文件与写数据库都事业有成,而将message按没有扩张的法子直接传入八个字符串,即log.debug(“新闻内容”)使用则不得不写入文件,而数据库则没写入。自定义的Layout 就是继续私下认可的PatternLayout,本来不应有出错,但出现了问题。原因剖析是自定义的message类有项目为int的习性,作为三个对象传入时在默许值0,而直白动用字符串则int型的字段得不到私下认可值,引发那几个。所以提出在有扩充存在时,最广大设多少个<logger>,区分清楚,依照统一的方式记录日志,不要混合使用。

4.            配置文件的安装一定要可信赖,在少数不得法就会招致日志不能够健康输出,所以在陈设时先从最简便易行的上马,同时输出方式接纳1种能出口log四net本人万分的措施,成功后一点一点加在新陈设,那样出错了也易于找到十三分地点安顿不正常。

5.            log四net扩充性很强,大致拥有的组件都能够重写,在配置文件中布局好就能够使用。

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

8、附注:

8、附注:

MemoryAppender 将日志存到内部存储器缓冲区。

八.壹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
一.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之间,少了在右边补空格,多了截断。

八.1帕特terLayout格式化字符表

转换字符

效果

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
一.0 不帮助System.Diagnostics.StackTrace 类。

本地音讯在调节和测试格局下可以健康获取,在非调节和测试方式下恐怕赢得不到,或只能取得一片段。(依据自个儿的测试,其实是供给有三个顺序数据库(.pdb)文件。)

%property属性要用代码来设置才能动用(相当于扩吉瓦尼尔多·胡尔克下),

默许属性log四net: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之间,少了在右边补空格,多了截断。

NetSendAppender 将日志输出到Windows Messenger service.那么些日记音信将在用户终端的对话框中体现。

8.2Layout类代码

  1 using System;
  2 
  3 using System.Collections.Generic;
  4 
  5 using System.Linq;
  6 
  7 using System.Text;
  8 
  9 using log4net.Layout;
 10 
 11 using log4net.Layout.Pattern;
 12 
 13 using System.Reflection;
 14 
 15 using System.Collections;
 16 
 17 using FastReflectionLib;
 18 
 19  
 20 
 21 namespace TGLog.ExpandLayout2
 22 
 23 {
 24 
 25     public class ReflectionLayout : PatternLayout
 26 
 27     {
 28 
 29         public ReflectionLayout()
 30 
 31         {
 32 
 33             this.AddConverter("property", typeof(ReflectionPatternConverter));
 34 
 35         }
 36 
 37     }
 38 
 39  
 40 
 41     public class ReflectionPatternConverter : PatternLayoutConverter
 42 
 43     {
 44 
 45         protected override void Convert(
 46 
 47 System.IO.TextWriter writer,
 48 
 49  log4net.Core.LoggingEvent loggingEvent
 50 
 51 )
 52 
 53         {
 54 
 55             if (Option != null)
 56 
 57             {
 58 
 59                 // 写入指定键的值
 60 
 61                 WriteObject(
 62 
 63 writer,
 64 
 65  loggingEvent.Repository,
 66 
 67  LookupProperty(Option,
 68 
 69  loggingEvent)
 70 
 71 );
 72 
 73             }
 74 
 75             else
 76 
 77             {
 78 
 79                 // 写入所有关键值对
 80 
 81                 WriteDictionary(
 82 
 83 writer,
 84 
 85 loggingEvent.Repository,
 86 
 87  loggingEvent.GetProperties()
 88 
 89 );
 90 
 91             }
 92 
 93         }
 94 
 95  
 96 
 97         /// <summary>
 98 
 99         /// 通过反射获取传入的日志对象的某个属性的值
100 
101         /// </summary>
102 
103         /// <param name="property"></param>
104 
105         /// <returns></returns>
106 
107         private object LookupProperty(
108 
109 string property,
110 
111  log4net.Core.LoggingEvent loggingEvent)
112 
113         {
114 
115             object propertyValue = string.Empty;
116 
117  
118 
119             PropertyInfo propertyInfo =
120 
121 loggingEvent.MessageObject.GetType().GetProperty(property);
122 
123             if (propertyInfo != null)
124 
125             {
126 
127                 propertyValue =
128 
129 propertyInfo.GetValue(loggingEvent.MessageObject, null);
130 
131             }
132 
133             return propertyValue;
134 
135         }
136 
137     }
138 
139 }

8.2Layout类代码

  1 using System;
  2 
  3 using System.Collections.Generic;
  4 
  5 using System.Linq;
  6 
  7 using System.Text;
  8 
  9 using log4net.Layout;
 10 
 11 using log4net.Layout.Pattern;
 12 
 13 using System.Reflection;
 14 
 15 using System.Collections;
 16 
 17 using FastReflectionLib;
 18 
 19  
 20 
 21 namespace TGLog.ExpandLayout2
 22 
 23 {
 24 
 25     public class ReflectionLayout : PatternLayout
 26 
 27     {
 28 
 29         public ReflectionLayout()
 30 
 31         {
 32 
 33             this.AddConverter("property", typeof(ReflectionPatternConverter));
 34 
 35         }
 36 
 37     }
 38 
 39  
 40 
 41     public class ReflectionPatternConverter : PatternLayoutConverter
 42 
 43     {
 44 
 45         protected override void Convert(
 46 
 47 System.IO.TextWriter writer,
 48 
 49  log4net.Core.LoggingEvent loggingEvent
 50 
 51 )
 52 
 53         {
 54 
 55             if (Option != null)
 56 
 57             {
 58 
 59                 // 写入指定键的值
 60 
 61                 WriteObject(
 62 
 63 writer,
 64 
 65  loggingEvent.Repository,
 66 
 67  LookupProperty(Option,
 68 
 69  loggingEvent)
 70 
 71 );
 72 
 73             }
 74 
 75             else
 76 
 77             {
 78 
 79                 // 写入所有关键值对
 80 
 81                 WriteDictionary(
 82 
 83 writer,
 84 
 85 loggingEvent.Repository,
 86 
 87  loggingEvent.GetProperties()
 88 
 89 );
 90 
 91             }
 92 
 93         }
 94 
 95  
 96 
 97         /// <summary>
 98 
 99         /// 通过反射获取传入的日志对象的某个属性的值
100 
101         /// </summary>
102 
103         /// <param name="property"></param>
104 
105         /// <returns></returns>
106 
107         private object LookupProperty(
108 
109 string property,
110 
111  log4net.Core.LoggingEvent loggingEvent)
112 
113         {
114 
115             object propertyValue = string.Empty;
116 
117  
118 
119             PropertyInfo propertyInfo =
120 
121 loggingEvent.MessageObject.GetType().GetProperty(property);
122 
123             if (propertyInfo != null)
124 
125             {
126 
127                 propertyValue =
128 
129 propertyInfo.GetValue(loggingEvent.MessageObject, null);
130 
131             }
132 
133             return propertyValue;
134 
135         }
136 
137     }
138 
139 }

OutputDebugStringAppender 将日志输出到Debuger,若是程序尚未Debuger,就输出到系统Debuger。假诺系统Debuger也不可用,将忽略音信。

8.3 MyLogImpl类代码

  1 using System;
  2 
  3 using System.Collections.Generic;
  4 
  5 using System.Linq;
  6 
  7 using System.Text;
  8 
  9 using log4net.Core;
 10 
 11  
 12 
 13 namespace TGLog.ExpandILog
 14 
 15 {
 16 
 17     public class MyLogImpl : LogImpl, IMyLog
 18 
 19     {
 20 
 21         /// <summary>
 22 
 23         /// The fully qualified name of this declaring type not the type of any subclass.
 24 
 25         /// </summary>
 26 
 27         private readonly static Type ThisDeclaringType = typeof(MyLogImpl);
 28 
 29  
 30 
 31         public MyLogImpl(ILogger logger)
 32 
 33             : base(logger)
 34 
 35         {       
 36 
 37         }
 38 
 39  
 40 
 41         #region Implementation of IMyLog
 42 
 43  
 44 
 45         public void Debug(int operatorID, string operand, int actionType,object message,
 46 
 47  string ip, string browser, string machineName)
 48 
 49         {
 50 
 51             Debug(operatorID,  operand,  actionType, message,
 52 
 53   ip,  browser, machineName, null);
 54 
 55         }
 56 
 57  
 58 
 59         public void Debug(int operatorID, string operand, int actionType,object message,
 60 
 61 string ip, string browser, string machineName, System.Exception t)
 62 
 63         {
 64 
 65             if (this.IsDebugEnabled)
 66 
 67             {
 68 
 69                 LoggingEvent loggingEvent =
 70 
 71 new LoggingEvent(ThisDeclaringType, Logger.Repository,
 72 
 73                                        Logger.Name, Level.Info, message, t);
 74 
 75                 loggingEvent.Properties["Operator"] = operatorID;
 76 
 77                 loggingEvent.Properties["Operand"] = operand;
 78 
 79                 loggingEvent.Properties["ActionType"] = actionType;
 80 
 81                 loggingEvent.Properties["IP"] = ip;
 82 
 83                 loggingEvent.Properties["Browser"] = browser;
 84 
 85                 loggingEvent.Properties["MachineName"] = machineName;
 86 
 87                 Logger.Log(loggingEvent);
 88 
 89             }
 90 
 91         }
 92 
 93  
 94 
 95         public void Info(int operatorID, string operand, int actionType, object message,
 96 
 97 string ip, string browser, string machineName)
 98 
 99         {
100 
101             Info(operatorID, operand, actionType, message, ip, browser, machineName, null);
102 
103         }
104 
105  
106 
107         public void Info(int operatorID, string operand, int actionType, object message,
108 
109  string ip, string browser, string machineName, System.Exception t)
110 
111         {
112 
113             if (this.IsInfoEnabled)
114 
115             {
116 
117                 LoggingEvent loggingEvent =
118 
119  new LoggingEvent(ThisDeclaringType, Logger.Repository,
120 
121  Logger.Name, Level.Info, message, t);
122 
123                 loggingEvent.Properties["Operator"] = operatorID;
124 
125                 loggingEvent.Properties["Operand"] = operand;
126 
127                 loggingEvent.Properties["ActionType"] = actionType;
128 
129                 loggingEvent.Properties["IP"] = ip;
130 
131                 loggingEvent.Properties["Browser"] = browser;
132 
133                 loggingEvent.Properties["MachineName"] = machineName;
134 
135                 Logger.Log(loggingEvent);
136 
137             }
138 
139         }
140 
141  
142 
143         public void Warn(int operatorID, string operand, int actionType, object message,
144 
145 string ip, string browser, string machineName)
146 
147         {
148 
149             Warn(operatorID, operand, actionType, message, ip, browser, machineName, null);
150 
151         }
152 
153  
154 
155         public void Warn(int operatorID, string operand, int actionType, object message,
156 
157  string ip, string browser, string machineName, System.Exception t)
158 
159         {
160 
161             if (this.IsWarnEnabled)
162 
163             {
164 
165                 LoggingEvent loggingEvent =
166 
167  new LoggingEvent(ThisDeclaringType, Logger.Repository,
168 
169 Logger.Name, Level.Info, message, t);
170 
171                 loggingEvent.Properties["Operator"] = operatorID;
172 
173                 loggingEvent.Properties["Operand"] = operand;
174 
175                 loggingEvent.Properties["ActionType"] = actionType;
176 
177                 loggingEvent.Properties["IP"] = ip;
178 
179                 loggingEvent.Properties["Browser"] = browser;
180 
181                 loggingEvent.Properties["MachineName"] = machineName;
182 
183                 Logger.Log(loggingEvent);
184 
185             }
186 
187         }
188 
189  
190 
191         public void Error(int operatorID, string operand, int actionType, object message,
192 
193 string ip, string browser, string machineName)
194 
195         {
196 
197             Error(operatorID, operand, actionType, message, ip, browser, machineName, null);
198 
199         }
200 
201  
202 
203         public void Error(int operatorID, string operand, int actionType, object message,
204 
205  string ip, string browser, string machineName, System.Exception t)
206 
207         {
208 
209             if (this.IsErrorEnabled)
210 
211             {
212 
213                 LoggingEvent loggingEvent =
214 
215  new LoggingEvent(ThisDeclaringType, Logger.Repository,
216 
217  Logger.Name, Level.Info, message, t);
218 
219                 loggingEvent.Properties["Operator"] = operatorID;
220 
221                 loggingEvent.Properties["Operand"] = operand;
222 
223                 loggingEvent.Properties["ActionType"] = actionType;
224 
225                 loggingEvent.Properties["IP"] = ip;
226 
227                 loggingEvent.Properties["Browser"] = browser;
228 
229                 loggingEvent.Properties["MachineName"] = machineName;
230 
231                 Logger.Log(loggingEvent);
232 
233             }
234 
235         }
236 
237  
238 
239         public void Fatal(int operatorID, string operand, int actionType, object message,
240 
241  string ip, string browser, string machineName)
242 
243         {
244 
245             Fatal(operatorID, operand, actionType, message, ip, browser, machineName, null);
246 
247         }
248 
249  
250 
251         public void Fatal(int operatorID, string operand, int actionType, object message,
252 
253  string ip, string browser, string machineName, System.Exception t)
254 
255         {
256 
257             if (this.IsFatalEnabled)
258 
259             {
260 
261                 LoggingEvent loggingEvent =
262 
263  new LoggingEvent(ThisDeclaringType, Logger.Repository,
264 
265                                        Logger.Name, Level.Info, message, t);
266 
267                 loggingEvent.Properties["Operator"] = operatorID;
268 
269                 loggingEvent.Properties["Operand"] = operand;
270 
271                 loggingEvent.Properties["ActionType"] = actionType;
272 
273                 loggingEvent.Properties["IP"] = ip;
274 
275                 loggingEvent.Properties["Browser"] = browser;
276 
277                 loggingEvent.Properties["MachineName"] = machineName;
278 
279                 Logger.Log(loggingEvent);
280 
281             }
282 
283         }
284 
285         #endregion Implementation of IMyLog
286 
287     }
288 
289 }

8.3 MyLogImpl类代码

  1 using System;
  2 
  3 using System.Collections.Generic;
  4 
  5 using System.Linq;
  6 
  7 using System.Text;
  8 
  9 using log4net.Core;
 10 
 11  
 12 
 13 namespace TGLog.ExpandILog
 14 
 15 {
 16 
 17     public class MyLogImpl : LogImpl, IMyLog
 18 
 19     {
 20 
 21         /// <summary>
 22 
 23         /// The fully qualified name of this declaring type not the type of any subclass.
 24 
 25         /// </summary>
 26 
 27         private readonly static Type ThisDeclaringType = typeof(MyLogImpl);
 28 
 29  
 30 
 31         public MyLogImpl(ILogger logger)
 32 
 33             : base(logger)
 34 
 35         {       
 36 
 37         }
 38 
 39  
 40 
 41         #region Implementation of IMyLog
 42 
 43  
 44 
 45         public void Debug(int operatorID, string operand, int actionType,object message,
 46 
 47  string ip, string browser, string machineName)
 48 
 49         {
 50 
 51             Debug(operatorID,  operand,  actionType, message,
 52 
 53   ip,  browser, machineName, null);
 54 
 55         }
 56 
 57  
 58 
 59         public void Debug(int operatorID, string operand, int actionType,object message,
 60 
 61 string ip, string browser, string machineName, System.Exception t)
 62 
 63         {
 64 
 65             if (this.IsDebugEnabled)
 66 
 67             {
 68 
 69                 LoggingEvent loggingEvent =
 70 
 71 new LoggingEvent(ThisDeclaringType, Logger.Repository,
 72 
 73                                        Logger.Name, Level.Info, message, t);
 74 
 75                 loggingEvent.Properties["Operator"] = operatorID;
 76 
 77                 loggingEvent.Properties["Operand"] = operand;
 78 
 79                 loggingEvent.Properties["ActionType"] = actionType;
 80 
 81                 loggingEvent.Properties["IP"] = ip;
 82 
 83                 loggingEvent.Properties["Browser"] = browser;
 84 
 85                 loggingEvent.Properties["MachineName"] = machineName;
 86 
 87                 Logger.Log(loggingEvent);
 88 
 89             }
 90 
 91         }
 92 
 93  
 94 
 95         public void Info(int operatorID, string operand, int actionType, object message,
 96 
 97 string ip, string browser, string machineName)
 98 
 99         {
100 
101             Info(operatorID, operand, actionType, message, ip, browser, machineName, null);
102 
103         }
104 
105  
106 
107         public void Info(int operatorID, string operand, int actionType, object message,
108 
109  string ip, string browser, string machineName, System.Exception t)
110 
111         {
112 
113             if (this.IsInfoEnabled)
114 
115             {
116 
117                 LoggingEvent loggingEvent =
118 
119  new LoggingEvent(ThisDeclaringType, Logger.Repository,
120 
121  Logger.Name, Level.Info, message, t);
122 
123                 loggingEvent.Properties["Operator"] = operatorID;
124 
125                 loggingEvent.Properties["Operand"] = operand;
126 
127                 loggingEvent.Properties["ActionType"] = actionType;
128 
129                 loggingEvent.Properties["IP"] = ip;
130 
131                 loggingEvent.Properties["Browser"] = browser;
132 
133                 loggingEvent.Properties["MachineName"] = machineName;
134 
135                 Logger.Log(loggingEvent);
136 
137             }
138 
139         }
140 
141  
142 
143         public void Warn(int operatorID, string operand, int actionType, object message,
144 
145 string ip, string browser, string machineName)
146 
147         {
148 
149             Warn(operatorID, operand, actionType, message, ip, browser, machineName, null);
150 
151         }
152 
153  
154 
155         public void Warn(int operatorID, string operand, int actionType, object message,
156 
157  string ip, string browser, string machineName, System.Exception t)
158 
159         {
160 
161             if (this.IsWarnEnabled)
162 
163             {
164 
165                 LoggingEvent loggingEvent =
166 
167  new LoggingEvent(ThisDeclaringType, Logger.Repository,
168 
169 Logger.Name, Level.Info, message, t);
170 
171                 loggingEvent.Properties["Operator"] = operatorID;
172 
173                 loggingEvent.Properties["Operand"] = operand;
174 
175                 loggingEvent.Properties["ActionType"] = actionType;
176 
177                 loggingEvent.Properties["IP"] = ip;
178 
179                 loggingEvent.Properties["Browser"] = browser;
180 
181                 loggingEvent.Properties["MachineName"] = machineName;
182 
183                 Logger.Log(loggingEvent);
184 
185             }
186 
187         }
188 
189  
190 
191         public void Error(int operatorID, string operand, int actionType, object message,
192 
193 string ip, string browser, string machineName)
194 
195         {
196 
197             Error(operatorID, operand, actionType, message, ip, browser, machineName, null);
198 
199         }
200 
201  
202 
203         public void Error(int operatorID, string operand, int actionType, object message,
204 
205  string ip, string browser, string machineName, System.Exception t)
206 
207         {
208 
209             if (this.IsErrorEnabled)
210 
211             {
212 
213                 LoggingEvent loggingEvent =
214 
215  new LoggingEvent(ThisDeclaringType, Logger.Repository,
216 
217  Logger.Name, Level.Info, message, t);
218 
219                 loggingEvent.Properties["Operator"] = operatorID;
220 
221                 loggingEvent.Properties["Operand"] = operand;
222 
223                 loggingEvent.Properties["ActionType"] = actionType;
224 
225                 loggingEvent.Properties["IP"] = ip;
226 
227                 loggingEvent.Properties["Browser"] = browser;
228 
229                 loggingEvent.Properties["MachineName"] = machineName;
230 
231                 Logger.Log(loggingEvent);
232 
233             }
234 
235         }
236 
237  
238 
239         public void Fatal(int operatorID, string operand, int actionType, object message,
240 
241  string ip, string browser, string machineName)
242 
243         {
244 
245             Fatal(operatorID, operand, actionType, message, ip, browser, machineName, null);
246 
247         }
248 
249  
250 
251         public void Fatal(int operatorID, string operand, int actionType, object message,
252 
253  string ip, string browser, string machineName, System.Exception t)
254 
255         {
256 
257             if (this.IsFatalEnabled)
258 
259             {
260 
261                 LoggingEvent loggingEvent =
262 
263  new LoggingEvent(ThisDeclaringType, Logger.Repository,
264 
265                                        Logger.Name, Level.Info, message, t);
266 
267                 loggingEvent.Properties["Operator"] = operatorID;
268 
269                 loggingEvent.Properties["Operand"] = operand;
270 
271                 loggingEvent.Properties["ActionType"] = actionType;
272 
273                 loggingEvent.Properties["IP"] = ip;
274 
275                 loggingEvent.Properties["Browser"] = browser;
276 
277                 loggingEvent.Properties["MachineName"] = machineName;
278 
279                 Logger.Log(loggingEvent);
280 
281             }
282 
283         }
284 
285         #endregion Implementation of IMyLog
286 
287     }
288 
289 }

RemoteSyslogAppender 通过UDP互联网协议将日志写到Remote syslog service。

8.4 MyLogManager类代码

  1 #region Copyright & License
  2 
  3 //
  4 
  5 // Copyright 2001-2005 The Apache Software Foundation
  6 
  7 //
  8 
  9 // Licensed under the Apache License, Version 2.0 (the "License");
 10 
 11 // you may not use this file except in compliance with the License.
 12 
 13 // You may obtain a copy of the License at
 14 
 15 //
 16 
 17 // http://www.apache.org/licenses/LICENSE-2.0
 18 
 19 //
 20 
 21 // Unless required by applicable law or agreed to in writing, software
 22 
 23 // distributed under the License is distributed on an "AS IS" BASIS,
 24 
 25 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 26 
 27 // See the License for the specific language governing permissions and
 28 
 29 // limitations under the License.
 30 
 31 //
 32 
 33 #endregion
 34 
 35  
 36 
 37 using System;
 38 
 39 using System.Reflection;
 40 
 41 using System.Collections;
 42 
 43 using log4net;
 44 
 45 using log4net.Core;
 46 
 47 using log4net.Repository;
 48 
 49 using log4net.Repository.Hierarchy;
 50 
 51  
 52 
 53 namespace TGLog.ExpandILog
 54 
 55 {
 56 
 57     public class MyLogManager
 58 
 59     {
 60 
 61         #region Static Member Variables
 62 
 63  
 64 
 65         /// <summary>
 66 
 67         /// The wrapper map to use to hold the <see cref="EventIDLogImpl"/> objects
 68 
 69         /// </summary>
 70 
 71         private static readonly WrapperMap s_wrapperMap = new WrapperMap(newWrapperCreationHandler(WrapperCreationHandler));
 72 
 73  
 74 
 75         #endregion
 76 
 77  
 78 
 79         #region Constructor
 80 
 81  
 82 
 83         /// <summary>
 84 
 85         /// Private constructor to prevent object creation
 86 
 87         /// </summary>
 88 
 89         private MyLogManager() { }
 90 
 91  
 92 
 93         #endregion
 94 
 95  
 96 
 97         #region Type Specific Manager Methods
 98 
 99  
100 
101         /// <summary>
102 
103         /// Returns the named logger if it exists
104 
105         /// </summary>
106 
107         /// <remarks>
108 
109         /// <para>If the named logger exists (in the default hierarchy) then it
110 
111         /// returns a reference to the logger, otherwise it returns
112 
113         /// <c>null</c>.</para>
114 
115         /// </remarks>
116 
117         /// <param name="name">The fully qualified logger name to look for</param>
118 
119         /// <returns>The logger found, or null</returns>
120 
121         public static IMyLog Exists(string name)
122 
123         {
124 
125             return Exists(Assembly.GetCallingAssembly(), name);
126 
127         }
128 
129  
130 
131         /// <summary>
132 
133         /// Returns the named logger if it exists
134 
135         /// </summary>
136 
137         /// <remarks>
138 
139         /// <para>If the named logger exists (in the specified domain) then it
140 
141         /// returns a reference to the logger, otherwise it returns
142 
143         /// <c>null</c>.</para>
144 
145         /// </remarks>
146 
147         /// <param name="domain">the domain to lookup in</param>
148 
149         /// <param name="name">The fully qualified logger name to look for</param>
150 
151         /// <returns>The logger found, or null</returns>
152 
153         public static IMyLog Exists(string domain, string name)
154 
155         {
156 
157             return WrapLogger(LoggerManager.Exists(domain, name));
158 
159         }
160 
161  
162 
163         /// <summary>
164 
165         /// Returns the named logger if it exists
166 
167         /// </summary>
168 
169         /// <remarks>
170 
171         /// <para>If the named logger exists (in the specified assembly's domain) then it
172 
173         /// returns a reference to the logger, otherwise it returns
174 
175         /// <c>null</c>.</para>
176 
177         /// </remarks>
178 
179         /// <param name="assembly">the assembly to use to lookup the domain</param>
180 
181         /// <param name="name">The fully qualified logger name to look for</param>
182 
183         /// <returns>The logger found, or null</returns>
184 
185         public static IMyLog Exists(Assembly assembly, string name)
186 
187         {
188 
189             return WrapLogger(LoggerManager.Exists(assembly, name));
190 
191         }
192 
193  
194 
195         /// <summary>
196 
197         /// Returns all the currently defined loggers in the default domain.
198 
199         /// </summary>
200 
201         /// <remarks>
202 
203         /// <para>The root logger is <b>not</b> included in the returned array.</para>
204 
205         /// </remarks>
206 
207         /// <returns>All the defined loggers</returns>
208 
209         public static IMyLog[] GetCurrentLoggers()
210 
211         {
212 
213             return GetCurrentLoggers(Assembly.GetCallingAssembly());
214 
215         }
216 
217  
218 
219         /// <summary>
220 
221         /// Returns all the currently defined loggers in the specified domain.
222 
223         /// </summary>
224 
225         /// <param name="domain">the domain to lookup in</param>
226 
227         /// <remarks>
228 
229         /// The root logger is <b>not</b> included in the returned array.
230 
231         /// </remarks>
232 
233         /// <returns>All the defined loggers</returns>
234 
235         public static IMyLog[] GetCurrentLoggers(string domain)
236 
237         {
238 
239             return WrapLoggers(LoggerManager.GetCurrentLoggers(domain));
240 
241         }
242 
243  
244 
245         /// <summary>
246 
247         /// Returns all the currently defined loggers in the specified assembly's domain.
248 
249         /// </summary>
250 
251         /// <param name="assembly">the assembly to use to lookup the domain</param>
252 
253         /// <remarks>
254 
255         /// The root logger is <b>not</b> included in the returned array.
256 
257         /// </remarks>
258 
259         /// <returns>All the defined loggers</returns>
260 
261         public static IMyLog[] GetCurrentLoggers(Assembly assembly)
262 
263         {
264 
265             return WrapLoggers(LoggerManager.GetCurrentLoggers(assembly));
266 
267         }
268 
269  
270 
271         /// <summary>
272 
273         /// Retrieve or create a named logger.
274 
275         /// </summary>
276 
277         /// <remarks>
278 
279         /// <para>Retrieve a logger named as the <paramref name="name"/>
280 
281         /// parameter. If the named logger already exists, then the
282 
283         /// existing instance will be returned. Otherwise, a new instance is
284 
285         /// created.</para>
286 
287         ///
288 
289         /// <para>By default, loggers do not have a set level but inherit
290 
291         /// it from the hierarchy. This is one of the central features of
292 
293         /// log4net.</para>
294 
295         /// </remarks>
296 
297         /// <param name="name">The name of the logger to retrieve.</param>
298 
299         /// <returns>the logger with the name specified</returns>
300 
301         public static IMyLog GetLogger(string name)
302 
303         {
304 
305             return GetLogger(Assembly.GetCallingAssembly(), name);
306 
307         }
308 
309  
310 
311         /// <summary>
312 
313         /// Retrieve or create a named logger.
314 
315         /// </summary>
316 
317         /// <remarks>
318 
319         /// <para>Retrieve a logger named as the <paramref name="name"/>
320 
321         /// parameter. If the named logger already exists, then the
322 
323         /// existing instance will be returned. Otherwise, a new instance is
324 
325         /// created.</para>
326 
327         ///
328 
329         /// <para>By default, loggers do not have a set level but inherit
330 
331         /// it from the hierarchy. This is one of the central features of
332 
333         /// log4net.</para>
334 
335         /// </remarks>
336 
337         /// <param name="domain">the domain to lookup in</param>
338 
339         /// <param name="name">The name of the logger to retrieve.</param>
340 
341         /// <returns>the logger with the name specified</returns>
342 
343         public static IMyLog GetLogger(string domain, string name)
344 
345         {
346 
347             return WrapLogger(LoggerManager.GetLogger(domain, name));
348 
349         }
350 
351  
352 
353         /// <summary>
354 
355         /// Retrieve or create a named logger.
356 
357         /// </summary>
358 
359         /// <remarks>
360 
361         /// <para>Retrieve a logger named as the <paramref name="name"/>
362 
363         /// parameter. If the named logger already exists, then the
364 
365         /// existing instance will be returned. Otherwise, a new instance is
366 
367         /// created.</para>
368 
369         ///
370 
371         /// <para>By default, loggers do not have a set level but inherit
372 
373         /// it from the hierarchy. This is one of the central features of
374 
375         /// log4net.</para>
376 
377         /// </remarks>
378 
379         /// <param name="assembly">the assembly to use to lookup the domain</param>
380 
381         /// <param name="name">The name of the logger to retrieve.</param>
382 
383         /// <returns>the logger with the name specified</returns>
384 
385         public static IMyLog GetLogger(Assembly assembly, string name)
386 
387         {
388 
389             return WrapLogger(LoggerManager.GetLogger(assembly, name));
390 
391         }
392 
393  
394 
395         /// <summary>
396 
397         /// Shorthand for <see cref="LogManager.GetLogger(string)"/>.
398 
399         /// </summary>
400 
401         /// <remarks>
402 
403         /// Get the logger for the fully qualified name of the type specified.
404 
405         /// </remarks>
406 
407         /// <param name="type">The full name of <paramref name="type"/> will
408 
409         /// be used as the name of the logger to retrieve.</param>
410 
411         /// <returns>the logger with the name specified</returns>
412 
413         public static IMyLog GetLogger(Type type)
414 
415         {
416 
417             return GetLogger(Assembly.GetCallingAssembly(), type.FullName);
418 
419         }
420 
421  
422 
423         /// <summary>
424 
425         /// Shorthand for <see cref="LogManager.GetLogger(string)"/>.
426 
427         /// </summary>
428 
429         /// <remarks>
430 
431         /// Get the logger for the fully qualified name of the type specified.
432 
433         /// </remarks>
434 
435         /// <param name="domain">the domain to lookup in</param>
436 
437         /// <param name="type">The full name of <paramref name="type"/> will
438 
439         /// be used as the name of the logger to retrieve.</param>
440 
441         /// <returns>the logger with the name specified</returns>
442 
443         public static IMyLog GetLogger(string domain, Type type)
444 
445         {
446 
447             return WrapLogger(LoggerManager.GetLogger(domain, type));
448 
449         }
450 
451  
452 
453         /// <summary>
454 
455         /// Shorthand for <see cref="LogManager.GetLogger(string)"/>.
456 
457         /// </summary>
458 
459         /// <remarks>
460 
461         /// Get the logger for the fully qualified name of the type specified.
462 
463         /// </remarks>
464 
465         /// <param name="assembly">the assembly to use to lookup the domain</param>
466 
467         /// <param name="type">The full name of <paramref name="type"/> will
468 
469         /// be used as the name of the logger to retrieve.</param>
470 
471         /// <returns>the logger with the name specified</returns>
472 
473         public static IMyLog GetLogger(Assembly assembly, Type type)
474 
475         {
476 
477             return WrapLogger(LoggerManager.GetLogger(assembly, type));
478 
479         }
480 
481  
482 
483         #endregion
484 
485  
486 
487         #region Extension Handlers
488 
489  
490 
491         /// <summary>
492 
493         /// Lookup the wrapper object for the logger specified
494 
495         /// </summary>
496 
497         /// <param name="logger">the logger to get the wrapper for</param>
498 
499         /// <returns>the wrapper for the logger specified</returns>
500 
501         private static IMyLog WrapLogger(ILogger logger)
502 
503         {
504 
505             return (IMyLog)s_wrapperMap.GetWrapper(logger);
506 
507         }
508 
509  
510 
511         /// <summary>
512 
513         /// Lookup the wrapper objects for the loggers specified
514 
515         /// </summary>
516 
517         /// <param name="loggers">the loggers to get the wrappers for</param>
518 
519         /// <returns>Lookup the wrapper objects for the loggers specified</returns>
520 
521         private static IMyLog[] WrapLoggers(ILogger[] loggers)
522 
523         {
524 
525             IMyLog[] results = new IMyLog[loggers.Length];
526 
527             for (int i = 0; i < loggers.Length; i++)
528 
529             {
530 
531                 results[i] = WrapLogger(loggers[i]);
532 
533             }
534 
535             return results;
536 
537         }
538 
539  
540 
541         /// <summary>
542 
543         /// Method to create the <see cref="ILoggerWrapper"/> objects used by
544 
545         /// this manager.
546 
547         /// </summary>
548 
549         /// <param name="logger">The logger to wrap</param>
550 
551         /// <returns>The wrapper for the logger specified</returns>
552 
553         private static ILoggerWrapper WrapperCreationHandler(ILogger logger)
554 
555         {
556 
557             return new MyLogImpl(logger);
558 
559         }
560 
561         #endregion
562 
563     }
564 
565 }

8.4 MyLogManager类代码

  1 #region Copyright & License
  2 
  3 //
  4 
  5 // Copyright 2001-2005 The Apache Software Foundation
  6 
  7 //
  8 
  9 // Licensed under the Apache License, Version 2.0 (the "License");
 10 
 11 // you may not use this file except in compliance with the License.
 12 
 13 // You may obtain a copy of the License at
 14 
 15 //
 16 
 17 // http://www.apache.org/licenses/LICENSE-2.0
 18 
 19 //
 20 
 21 // Unless required by applicable law or agreed to in writing, software
 22 
 23 // distributed under the License is distributed on an "AS IS" BASIS,
 24 
 25 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 26 
 27 // See the License for the specific language governing permissions and
 28 
 29 // limitations under the License.
 30 
 31 //
 32 
 33 #endregion
 34 
 35  
 36 
 37 using System;
 38 
 39 using System.Reflection;
 40 
 41 using System.Collections;
 42 
 43 using log4net;
 44 
 45 using log4net.Core;
 46 
 47 using log4net.Repository;
 48 
 49 using log4net.Repository.Hierarchy;
 50 
 51  
 52 
 53 namespace TGLog.ExpandILog
 54 
 55 {
 56 
 57     public class MyLogManager
 58 
 59     {
 60 
 61         #region Static Member Variables
 62 
 63  
 64 
 65         /// <summary>
 66 
 67         /// The wrapper map to use to hold the <see cref="EventIDLogImpl"/> objects
 68 
 69         /// </summary>
 70 
 71         private static readonly WrapperMap s_wrapperMap = new WrapperMap(newWrapperCreationHandler(WrapperCreationHandler));
 72 
 73  
 74 
 75         #endregion
 76 
 77  
 78 
 79         #region Constructor
 80 
 81  
 82 
 83         /// <summary>
 84 
 85         /// Private constructor to prevent object creation
 86 
 87         /// </summary>
 88 
 89         private MyLogManager() { }
 90 
 91  
 92 
 93         #endregion
 94 
 95  
 96 
 97         #region Type Specific Manager Methods
 98 
 99  
100 
101         /// <summary>
102 
103         /// Returns the named logger if it exists
104 
105         /// </summary>
106 
107         /// <remarks>
108 
109         /// <para>If the named logger exists (in the default hierarchy) then it
110 
111         /// returns a reference to the logger, otherwise it returns
112 
113         /// <c>null</c>.</para>
114 
115         /// </remarks>
116 
117         /// <param name="name">The fully qualified logger name to look for</param>
118 
119         /// <returns>The logger found, or null</returns>
120 
121         public static IMyLog Exists(string name)
122 
123         {
124 
125             return Exists(Assembly.GetCallingAssembly(), name);
126 
127         }
128 
129  
130 
131         /// <summary>
132 
133         /// Returns the named logger if it exists
134 
135         /// </summary>
136 
137         /// <remarks>
138 
139         /// <para>If the named logger exists (in the specified domain) then it
140 
141         /// returns a reference to the logger, otherwise it returns
142 
143         /// <c>null</c>.</para>
144 
145         /// </remarks>
146 
147         /// <param name="domain">the domain to lookup in</param>
148 
149         /// <param name="name">The fully qualified logger name to look for</param>
150 
151         /// <returns>The logger found, or null</returns>
152 
153         public static IMyLog Exists(string domain, string name)
154 
155         {
156 
157             return WrapLogger(LoggerManager.Exists(domain, name));
158 
159         }
160 
161  
162 
163         /// <summary>
164 
165         /// Returns the named logger if it exists
166 
167         /// </summary>
168 
169         /// <remarks>
170 
171         /// <para>If the named logger exists (in the specified assembly's domain) then it
172 
173         /// returns a reference to the logger, otherwise it returns
174 
175         /// <c>null</c>.</para>
176 
177         /// </remarks>
178 
179         /// <param name="assembly">the assembly to use to lookup the domain</param>
180 
181         /// <param name="name">The fully qualified logger name to look for</param>
182 
183         /// <returns>The logger found, or null</returns>
184 
185         public static IMyLog Exists(Assembly assembly, string name)
186 
187         {
188 
189             return WrapLogger(LoggerManager.Exists(assembly, name));
190 
191         }
192 
193  
194 
195         /// <summary>
196 
197         /// Returns all the currently defined loggers in the default domain.
198 
199         /// </summary>
200 
201         /// <remarks>
202 
203         /// <para>The root logger is <b>not</b> included in the returned array.</para>
204 
205         /// </remarks>
206 
207         /// <returns>All the defined loggers</returns>
208 
209         public static IMyLog[] GetCurrentLoggers()
210 
211         {
212 
213             return GetCurrentLoggers(Assembly.GetCallingAssembly());
214 
215         }
216 
217  
218 
219         /// <summary>
220 
221         /// Returns all the currently defined loggers in the specified domain.
222 
223         /// </summary>
224 
225         /// <param name="domain">the domain to lookup in</param>
226 
227         /// <remarks>
228 
229         /// The root logger is <b>not</b> included in the returned array.
230 
231         /// </remarks>
232 
233         /// <returns>All the defined loggers</returns>
234 
235         public static IMyLog[] GetCurrentLoggers(string domain)
236 
237         {
238 
239             return WrapLoggers(LoggerManager.GetCurrentLoggers(domain));
240 
241         }
242 
243  
244 
245         /// <summary>
246 
247         /// Returns all the currently defined loggers in the specified assembly's domain.
248 
249         /// </summary>
250 
251         /// <param name="assembly">the assembly to use to lookup the domain</param>
252 
253         /// <remarks>
254 
255         /// The root logger is <b>not</b> included in the returned array.
256 
257         /// </remarks>
258 
259         /// <returns>All the defined loggers</returns>
260 
261         public static IMyLog[] GetCurrentLoggers(Assembly assembly)
262 
263         {
264 
265             return WrapLoggers(LoggerManager.GetCurrentLoggers(assembly));
266 
267         }
268 
269  
270 
271         /// <summary>
272 
273         /// Retrieve or create a named logger.
274 
275         /// </summary>
276 
277         /// <remarks>
278 
279         /// <para>Retrieve a logger named as the <paramref name="name"/>
280 
281         /// parameter. If the named logger already exists, then the
282 
283         /// existing instance will be returned. Otherwise, a new instance is
284 
285         /// created.</para>
286 
287         ///
288 
289         /// <para>By default, loggers do not have a set level but inherit
290 
291         /// it from the hierarchy. This is one of the central features of
292 
293         /// log4net.</para>
294 
295         /// </remarks>
296 
297         /// <param name="name">The name of the logger to retrieve.</param>
298 
299         /// <returns>the logger with the name specified</returns>
300 
301         public static IMyLog GetLogger(string name)
302 
303         {
304 
305             return GetLogger(Assembly.GetCallingAssembly(), name);
306 
307         }
308 
309  
310 
311         /// <summary>
312 
313         /// Retrieve or create a named logger.
314 
315         /// </summary>
316 
317         /// <remarks>
318 
319         /// <para>Retrieve a logger named as the <paramref name="name"/>
320 
321         /// parameter. If the named logger already exists, then the
322 
323         /// existing instance will be returned. Otherwise, a new instance is
324 
325         /// created.</para>
326 
327         ///
328 
329         /// <para>By default, loggers do not have a set level but inherit
330 
331         /// it from the hierarchy. This is one of the central features of
332 
333         /// log4net.</para>
334 
335         /// </remarks>
336 
337         /// <param name="domain">the domain to lookup in</param>
338 
339         /// <param name="name">The name of the logger to retrieve.</param>
340 
341         /// <returns>the logger with the name specified</returns>
342 
343         public static IMyLog GetLogger(string domain, string name)
344 
345         {
346 
347             return WrapLogger(LoggerManager.GetLogger(domain, name));
348 
349         }
350 
351  
352 
353         /// <summary>
354 
355         /// Retrieve or create a named logger.
356 
357         /// </summary>
358 
359         /// <remarks>
360 
361         /// <para>Retrieve a logger named as the <paramref name="name"/>
362 
363         /// parameter. If the named logger already exists, then the
364 
365         /// existing instance will be returned. Otherwise, a new instance is
366 
367         /// created.</para>
368 
369         ///
370 
371         /// <para>By default, loggers do not have a set level but inherit
372 
373         /// it from the hierarchy. This is one of the central features of
374 
375         /// log4net.</para>
376 
377         /// </remarks>
378 
379         /// <param name="assembly">the assembly to use to lookup the domain</param>
380 
381         /// <param name="name">The name of the logger to retrieve.</param>
382 
383         /// <returns>the logger with the name specified</returns>
384 
385         public static IMyLog GetLogger(Assembly assembly, string name)
386 
387         {
388 
389             return WrapLogger(LoggerManager.GetLogger(assembly, name));
390 
391         }
392 
393  
394 
395         /// <summary>
396 
397         /// Shorthand for <see cref="LogManager.GetLogger(string)"/>.
398 
399         /// </summary>
400 
401         /// <remarks>
402 
403         /// Get the logger for the fully qualified name of the type specified.
404 
405         /// </remarks>
406 
407         /// <param name="type">The full name of <paramref name="type"/> will
408 
409         /// be used as the name of the logger to retrieve.</param>
410 
411         /// <returns>the logger with the name specified</returns>
412 
413         public static IMyLog GetLogger(Type type)
414 
415         {
416 
417             return GetLogger(Assembly.GetCallingAssembly(), type.FullName);
418 
419         }
420 
421  
422 
423         /// <summary>
424 
425         /// Shorthand for <see cref="LogManager.GetLogger(string)"/>.
426 
427         /// </summary>
428 
429         /// <remarks>
430 
431         /// Get the logger for the fully qualified name of the type specified.
432 
433         /// </remarks>
434 
435         /// <param name="domain">the domain to lookup in</param>
436 
437         /// <param name="type">The full name of <paramref name="type"/> will
438 
439         /// be used as the name of the logger to retrieve.</param>
440 
441         /// <returns>the logger with the name specified</returns>
442 
443         public static IMyLog GetLogger(string domain, Type type)
444 
445         {
446 
447             return WrapLogger(LoggerManager.GetLogger(domain, type));
448 
449         }
450 
451  
452 
453         /// <summary>
454 
455         /// Shorthand for <see cref="LogManager.GetLogger(string)"/>.
456 
457         /// </summary>
458 
459         /// <remarks>
460 
461         /// Get the logger for the fully qualified name of the type specified.
462 
463         /// </remarks>
464 
465         /// <param name="assembly">the assembly to use to lookup the domain</param>
466 
467         /// <param name="type">The full name of <paramref name="type"/> will
468 
469         /// be used as the name of the logger to retrieve.</param>
470 
471         /// <returns>the logger with the name specified</returns>
472 
473         public static IMyLog GetLogger(Assembly assembly, Type type)
474 
475         {
476 
477             return WrapLogger(LoggerManager.GetLogger(assembly, type));
478 
479         }
480 
481  
482 
483         #endregion
484 
485  
486 
487         #region Extension Handlers
488 
489  
490 
491         /// <summary>
492 
493         /// Lookup the wrapper object for the logger specified
494 
495         /// </summary>
496 
497         /// <param name="logger">the logger to get the wrapper for</param>
498 
499         /// <returns>the wrapper for the logger specified</returns>
500 
501         private static IMyLog WrapLogger(ILogger logger)
502 
503         {
504 
505             return (IMyLog)s_wrapperMap.GetWrapper(logger);
506 
507         }
508 
509  
510 
511         /// <summary>
512 
513         /// Lookup the wrapper objects for the loggers specified
514 
515         /// </summary>
516 
517         /// <param name="loggers">the loggers to get the wrappers for</param>
518 
519         /// <returns>Lookup the wrapper objects for the loggers specified</returns>
520 
521         private static IMyLog[] WrapLoggers(ILogger[] loggers)
522 
523         {
524 
525             IMyLog[] results = new IMyLog[loggers.Length];
526 
527             for (int i = 0; i < loggers.Length; i++)
528 
529             {
530 
531                 results[i] = WrapLogger(loggers[i]);
532 
533             }
534 
535             return results;
536 
537         }
538 
539  
540 
541         /// <summary>
542 
543         /// Method to create the <see cref="ILoggerWrapper"/> objects used by
544 
545         /// this manager.
546 
547         /// </summary>
548 
549         /// <param name="logger">The logger to wrap</param>
550 
551         /// <returns>The wrapper for the logger specified</returns>
552 
553         private static ILoggerWrapper WrapperCreationHandler(ILogger logger)
554 
555         {
556 
557             return new MyLogImpl(logger);
558 
559         }
560 
561         #endregion
562 
563     }
564 
565 }

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

8.5 IMyLog类代码

 1 using System;
 2 
 3 using System.Collections.Generic;
 4 
 5 using System.Linq;
 6 
 7 using System.Text;
 8 
 9 using log4net;
10 
11  
12 
13 namespace TGLog.ExpandILog
14 
15 {
16 
17     public interface IMyLog : ILog
18 
19     {
20 
21         void Debug(int operatorID, string operand, int actionType, object message,
22 
23 string ip, string browser, string machineName);
24 
25         void Debug(int operatorID, string operand, int actionType,object message,
26 
27 string ip, string browser, string machineName, Exception t);
28 
29  
30 
31         void Info(int operatorID, string operand, int actionType, object message,
32 
33 string ip, string browser, string machineName);
34 
35         void Info(int operatorID, string operand, int actionType, object message,
36 
37 string ip, string browser, string machineName, Exception t);
38 
39  
40 
41         void Warn(int operatorID, string operand, int actionType, object message,
42 
43 string ip, string browser, string machineName);
44 
45         void Warn(int operatorID, string operand, int actionType, object message,
46 
47  string ip, string browser, string machineName, Exception t);
48 
49  
50 
51         void Error(int operatorID, string operand, int actionType, object message,
52 
53 string ip, string browser, string machineName);
54 
55         void Error(int operatorID, string operand, int actionType, object message,
56 
57 string ip, string browser, string machineName, Exception t);
58 
59  
60 
61         void Fatal(int operatorID, string operand, int actionType, object message,
62 
63 string ip, string browser, string machineName);
64 
65         void Fatal(int operatorID, string operand, int actionType, object message,
66 
67 string ip, string browser, string machineName, Exception t);
68 
69     }
70 
71 }

8.5 IMyLog类代码

 1 using System;
 2 
 3 using System.Collections.Generic;
 4 
 5 using System.Linq;
 6 
 7 using System.Text;
 8 
 9 using log4net;
10 
11  
12 
13 namespace TGLog.ExpandILog
14 
15 {
16 
17     public interface IMyLog : ILog
18 
19     {
20 
21         void Debug(int operatorID, string operand, int actionType, object message,
22 
23 string ip, string browser, string machineName);
24 
25         void Debug(int operatorID, string operand, int actionType,object message,
26 
27 string ip, string browser, string machineName, Exception t);
28 
29  
30 
31         void Info(int operatorID, string operand, int actionType, object message,
32 
33 string ip, string browser, string machineName);
34 
35         void Info(int operatorID, string operand, int actionType, object message,
36 
37 string ip, string browser, string machineName, Exception t);
38 
39  
40 
41         void Warn(int operatorID, string operand, int actionType, object message,
42 
43 string ip, string browser, string machineName);
44 
45         void Warn(int operatorID, string operand, int actionType, object message,
46 
47  string ip, string browser, string machineName, Exception t);
48 
49  
50 
51         void Error(int operatorID, string operand, int actionType, object message,
52 
53 string ip, string browser, string machineName);
54 
55         void Error(int operatorID, string operand, int actionType, object message,
56 
57 string ip, string browser, string machineName, Exception t);
58 
59  
60 
61         void Fatal(int operatorID, string operand, int actionType, object message,
62 
63 string ip, string browser, string machineName);
64 
65         void Fatal(int operatorID, string operand, int actionType, object message,
66 
67 string ip, string browser, string machineName, Exception t);
68 
69     }
70 
71 }

 RollingFileAppender 将日志以回滚文件的情势写到文件中。

8.6附件

log四net记录日志.exe

 

8.6附件

log四net记录日志.exe

 

SmtpAppender 将日志写到邮件中。

SmtpPickupDirAppender 将新闻以文件的格局放入3个目录中,像IIS SMTP
agent那样的SMTP代理就能够翻阅或发送它们。

TelnetAppender 客户端通过Telnet来接受日志事件。

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

UdpAppender 将日志以无连接UDP数据报的款型送到长途宿主或用UdpClient的样式播放。

     2.Filters

使用过滤器能够过滤掉Appender输出的始末。过滤器平日有以下三种:

DenyAllFilter 阻止全部的日志事件被记录

LevelMatchFilter 只有钦点等级的日记事件才被记录

LevelRangeFilter 日志等级在钦定范围内的轩然大波才被记录

LoggerMatchFilter 与Logger名称相配,才记录

PropertyFilter 音信相称钦点的属性值时才被记录

StringMathFilter 新闻相称钦定的字符串才被记录

3.Layouts

Layout用于控制Appender的输出格式,能够是线性的也得以是XML。

三个Appender只可以有一个Layout。

最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等多少个,使用较少。Layout可以团结达成,须求从log肆net.Layout.LayoutSkeleton类继承,来输出1些非同小可须求的格式,在末端扩张时就再次达成了一个Layout。

SimpleLayout简单输出格式,只输出日志级别与音信内容。

RawTimeStampLayout 用来格式化时间,在向数据库输出时会用到。

样式如“yyyy-MM-dd HH:mm:ss“

ExceptionLayout要求给Logger的方法传入Exception对象作为参数才起功能,不然就怎么也不出口。输出的时候会含有Message和Trace。

PatterLayout使用最多的2个Layout,能出口的消息很多。

4.Loggers

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

Logger提供了多样艺术来记录贰个日记音信,也足以有四个Logger同时存在。每一个实例化的Logger对象对被log四net作为命名实体(Named
Entity)来维护。log四net使用持续系列,也正是说假诺存在多少个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,E奥迪Q5RO汉兰达,WARN,INFO会被写入,因为她们等级高于INFO。

在切实可行写日记时,1般能够如此敞亮日志等级:

FATAL(致命错误):记录系统中出现的能动用系统完全失去功用,服务结束,系统崩溃等使系统一点都不大概继续运营下去的失实。例如,数据库无法连接,系统出现死循环。

E途乐ROQX56(一般错误):记录系统中冒出的导致系统不稳定,部分机能出现混乱或1些功效失效1类的不当。例如,数据字段为空,数据操作不可实现,操作出现非凡等。

WA中华VN(警告):记录系统中不影响系统持续运营,但不合乎系统运营如常尺度,有十分的大可能率滋生系统错误的音信。例如,记录内容为空,数据内容不得法等。

INFO(1般音信):记录系统运作中应有让用户知道的主干消息。例如,服务开头运营,作用已经开户等。

DEBUG (调节和测试信息):记录系统用于调节和测试的万事消息,内容依然是壹些首要数据内容的输出。

Logger达成的ILog接口,ILog定义了五个章程(Debug,Inof,Warn,Error,Fatal)分别对差异的日志等级记录日志。那多少个艺术还有多少个重载。以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”);

5.Object Renders

它将告诉logger怎么样把2个指标转化为三个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String。)

譬如说你想把Orange对象记录到日志中,但这时logger只会调用Orange暗中认可的ToString方法而已。所以要定义贰个OrangeRender类实现log四net.ObjectRender.IObjectRender接口,然后注册它(大家在本文中的扩大不采取那种艺术,而是直接完毕3个自定义的Layout)。那时logger就会清楚怎么把Orange记录到日志中了。

       6.Repository

         Repository首要用于日志对象组织结构的保证。  

 PS来源:

 

   

 

      

  


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图