log4net日志框架.docx

上传人:b****2 文档编号:24243313 上传时间:2023-05-25 格式:DOCX 页数:19 大小:326.86KB
下载 相关 举报
log4net日志框架.docx_第1页
第1页 / 共19页
log4net日志框架.docx_第2页
第2页 / 共19页
log4net日志框架.docx_第3页
第3页 / 共19页
log4net日志框架.docx_第4页
第4页 / 共19页
log4net日志框架.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

log4net日志框架.docx

《log4net日志框架.docx》由会员分享,可在线阅读,更多相关《log4net日志框架.docx(19页珍藏版)》请在冰豆网上搜索。

log4net日志框架.docx

log4net日志框架

Log4net日志管理框架

1功能描述

本框架是一套用来诊断和修复配置问题的日志系统。

主要功能包括日志分级功能、日志目的地配置、日志格式配置和日志功能扩展。

日志分级功能,是指可以按照不同的级别来输出对后续处理要求不同或者对系统的后续运行影响不同的日志。

本框架按照优先级从高到低将日志分为了OFF、FATAL、ERROR、WARN、INFO、DEBUG和ALL共7个级别,其中OFF等同于关闭日志功能不做任何记录,而ALL则是记录所有的日志信息。

日志目的地配置,是指可以根据不同的需要,确定日志的输出方式和位置。

日志的输出方式共提供有数据库、文件、控制台、事件等共计20种模式可供选择。

日志格式设置,是指可以根据需要,确定日志的输出格式,是线性的还是xml树状结构,具体每一条日志又需要记录哪些信息、各个参数之间的先后顺序等等。

日志功能扩展,是指用户可以通过对本框架的实现和重载,来按照自己的需要实现日志的更多的功能操作以及结构的扩展。

2系统结构

本框架一般包含Appenders、Filters、Layouts、Loggers、ObjectRenders和Repository六个主要部分。

系统框架结构图:

2.1Appender

Appenders,用来定义日志的输出方式。

它还可以通过配置Filters和Layout来实现日志的过滤和输出格式。

Appender相关的类图:

Appender的20种输出模式:

1)AdoNetAppender将日志记录到数据库中。

可以采用SQL和存储过程两种方式。

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

3)AspNetTraceAppender能用中Trace的方式查看记录的日志。

4)BufferingForwardingAppender在输出到子Appenders之前先缓存日志事件。

5)ConsoleAppender将日志输出到应用程序控制台。

6)EventLogAppender将日志写到WindowsEventLog。

7)FileAppender将日志输出到文件。

8)ForwardingAppender发送日志事件到子Appenders。

9)LocalSyslogAppender将日志写到localsyslogservice(仅用于UNIX环境下)。

10)MemoryAppender将日志存到内存缓冲区。

11)NetSendAppender将日志输出到WindowsMessengerservice.这些日志信息将在用户终端的对话框中显示。

12)OutputDebugStringAppender将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。

如果系统Debuger也不可用,将忽略消息。

13)RemoteSyslogAppender通过UDP网络协议将日志写到Remotesyslogservice。

14)RemotingAppender通过.NETRemoting将日志写到远程接收端。

15)RollingFileAppender将日志以回滚文件的形式写到文件中。

16)SmtpAppender将日志写到邮件中。

17)SmtpPickupDirAppender将消息以文件的方式放入一个目录中,像IISSMTPagent这样的SMTP代理就可以阅读或发送它们。

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

19)TraceAppender将日志写到.NETtrace系统。

20)UdpAppender将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。

2.2AppenderFilters

AppenderFilters,可以按照不同的标准过滤日志事件。

在log4net.Filter的名字空间下已经有几个预定义的过滤器。

使用这些过滤器,你可以按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。

以满足某些特殊的情况下对于屏蔽日志信息的的需要。

Filter相关类图:

2.3layout

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

一个Appender只能有一个Layout。

Layout相关类图:

最常用的Layout应该是用户自定义格式的PatternLayout,其次是SimpleLayout和ExceptionLayout。

然后还有4个Layout,其中有两个是输出xml的Layout,但是中文会有问题。

ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。

输出的时候会包含Message和Trace。

格式化字符串说明见表1。

表1:

格式化字符串说明表

ConversionPatternName

Effect

a

等价于appdomain

appdomain

引发日志事件的应用程序域的友好名称。

(我在使用中一般是可执行文件的名字。

c

等价于logger

C

等价于type

class

等价于type

d

等价于date

date

发生日志事件的本地时间。

使用%utcdate输出UTC时间。

date后面还可以跟一个日期格式,用大括号括起来。

例如:

%date{HH:

mm:

ss,fff}或者%date{ddMMMyyyyHH:

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(nesteddiagnosticcontext)

p

等价于level

P

等价于property

properties

等价于property

property

输出事件的特殊属性。

例如:

%property{user}输出user属性。

属性是由loggers或appenders添加到时间中的。

有一个默认的属性"log4net:

HostName"总是会有。

%property将输出所以的属性。

(我除了知道可以用它获得主机名外,还不知道怎么用。

r

等价于timestamp

t

等价于thread

timestamp

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

thread

引发日志事件的线程,如果没有线程名就使用线程号。

type

引发日志请求的类的全名。

可以使用精度控制符。

例如:

类名是"log4net.Layout.PatternLayout",格式模型是%type{1}将输出"PatternLayout"。

(也是从右开始的。

)警告:

会影响性能。

u

等价于identity

username

当前用户的WindowsIdentity。

(类似:

HostName\Username)警告:

会影响性能。

utcdate

发生日志事件的UTC时间。

后面还可以跟一个日期格式,用大括号括起来。

例如:

%utcdate{HH:

mm:

ss,fff}或者%utcdate{ddMMMyyyyHH:

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

%

%%输出一个百分号

在格式化字符串定义的过程中,可能需要用到转义字符,转义字符的修饰符见表2。

表2:

格式化字符串修饰符说明表

Formatmodifier

leftjustify

minimumwidth

maximumwidth

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

2.4Loggers

Logger是直接和应用程序交互的组件。

Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。

Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(namedentity)来维护。

这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。

Ilog的类结构图:

对于日志的级别,是这样定义的:

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

从左到右优先级依次降低。

其中OFF表示停用所以日志记录,ALL表示所有日志都可以记录。

Logger实现的ILog接口,ILog定义了5个方法(Debug,Inof,Warn,Error,Fatal)分别对不同的日志等级记录日志。

Ilog接口结构:

这5个方法还有5个重载。

我们以Debug为例说明一下,其它的和它差不多。

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

voidDebug(objectmessage);

voidDebug(objectmessage,Exceptionex);

还有一个布尔属性:

boolIsDebugEnabled{get;}

如果使用Debug(objectmessage,Exceptionex),则无论Layout中是否定义了%exception,默认配置下日志都会输出Exception。

包括Exception的Message和Trace。

如果使用Debug(objectmessage),则无论如何日志是不会输出Exception的,因为没有。

2.5ObjectRenders

ObjectRenders,它将告诉logger如何把一个对象转化为一个字符串记录到日志里。

例如把Orange对象记录到日志中,此时logger只会调用Orange默认的ToString方法而已。

所以要定义一个OrangeRender类实现log4net.ObjectRender.IObjectRender接口,然后注册它。

这时logger就会知道如何把Orange记录到日志中了。

2.6Repository

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

在log4net的以前版本中,框架仅支持分等级的组织结构(hierarchicalorganization)。

这种等级结构本质上是库的一个实现,并且定义在log4net.Repository.Hierarchy名字空间中。

要实现一个Repository,需要实现log4net.Repository.ILoggerRepository接口。

但是通常并不是直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。

体系库(hierarchicalrepository)则由log4net.Repository.Hierarchy.Hierarchy类实现。

LoggerRepositorySkeleton和Repository.Hierarchy类结构图:

3框架使用

本框架需要先进行配置,然后关联配置文件,创建或获取日志对象,之后才能使用。

3.1框架配置

在开始程序进行日志记录前,需要先启动log4net引擎,这意味着你需要先配置logger、appender和layout三种组件。

你可以用两种方法来设定配置:

在单独的文件中设定配置或在代码中定义配置。

考虑到代码定义的繁琐,一般都是在单独的文件如xml文件中进行配置。

配置信息可以放在如下几种形式文件的一种中。

一个简单的配置文件实例:

xmlversion="1.0"encoding="utf-8"?

>

type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.2.10"/>

type="log4net.Appender.FileAppender">

value="%d[%t]%-5p%c[%x]-%m%n"/>

type="log4net.Appender.ConsoleAppender">

value="%d[%t]%-5p%c[%x]-%m%n"/>

其中,如果log4net的配置在自己定义的文件里而不是放在应用程序的配置文件里,那么,节点里的

节点是不需要的。

配置文件的各个节点的说明见表3

表3:

配置文件节点说明表

下面是系统解析xml配置文件的类图:

由图可以清晰的看到两种配置方式:

一是直接在代码中通过调用XmlConfigurator.Configure()来解析配置文件,配置日志环境;

二是通过定义程序集特性来加载并解析配置文件,配置日志环境。

不过这种方式只能在创建第一个ILog对象时才能加载配置文件。

3.2关联配置文件

log4net默认关联的是应用程序的配置文件(AppName.exe.config),可以使用程序集自定义属性log4net.Config.XmlConifguratorAttribute来进行设置。

XmlConfiguratorAttribute有3个属性:

ConfigFile配置文件的名字,文件路径相对于应用程序目录(AppDomain.CurrentDomain.BaseDirectory)。

ConfigFile属性不能和ConfigFileExtension属性一起使用。

ConfigFileExtension配置文件的扩展名,文件路径相对于应用程序的目录。

ConfigFileExtension属性不能和ConfigFile属性一起使用。

Watch如果将Watch属性设置为true,就会监视配置文件。

当配置文件发生变化的时候,就会重新加载。

如果ConfigFile和ConfigFileExtension都没有设置,则使用应用程序的配置文件(AppName.exe.config)。

配置日志环境流程图:

3.3创建对象

ILog对象是通过LogManager工具类来创建的。

LogManager工具类通过LoggerManager创建ILogger对象,然后使用ILoggerWraper对其进行包装,并通过WrapperMap进行管理Logger和ILoggerWraper之间的映射。

ILogger对象的集合在ILoggerRepository中按一定的结构进行组合和管理所以需要从ILoggerRepository中获取ILogger对象。

欲获取ILogger对象,必须首先获取ILoggerRepository对象。

IRepositorySelector就是负责缓存和管理ILoggerRepository对象的类,所以需要通过IRepositorySelector获取ILogger对象所在的ILoggerRepository对象,然后再从ILoggerRepository对象中获取ILogger对象。

创建Ilog对象过程图:

3.4记录日志

通过LogManager.GetLogger()获取ILog对象,然后通过ILog对象的Error()等方法记录日志。

但是ILog对象的方法最终会映射为ILogger对象的Log()方法。

在调用ILogger的Log()方法时,会创建一个LoggingEvent对象,此对象记录了日志的信息,之后就可以把LoggingEvent对象在ILogger对象和IAppender对象之间传递,直到把日志信息写入TextWriter中才可销毁。

LoggingEvent对象的生命周期是从调用ILogger的Log()方法起,直到此条消息写入TextWriter中为止。

ILogger对象需要调用自己的IAppender对象来把日志信息写到媒体上,IAppender对象需要调用IFilter对象来过滤需要写入媒体的日志,然后调用ILayout对象来设置日志的输出格式。

记录日志过程图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1