您的位置:首页 > 其它

Log4net使用总结,防止自定义的logger和root重复写入日志

2012-06-18 17:33 639 查看
一、在asp.net中使用log4net

1、添加log4net.dll引用

2、编辑配置文件,有两种做法:放在web.config里或放在单独的文件里,我们一般放在单独的文件里,这样做的好处--修改log4net的配置不会影响到整个应用重启

3、在Global.asax的Application_Start里加入如下代码


log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~")+@"\log4net.xml"));



log4net.xml为log4net的配置文件,"\log4net.xml"为配置文件相对于站点的路径


4、创建日志对象,一般定义为一个类的私有静态字段


private static readonly ILog log = LogManager.GetLogger(typeof(类名).Name);


5、写日志


if (log.IsDebugEnabled)

{

log.Debug("日志信息");

}


二、在分层构架中使用log4net

一般asp.net项目都会使用分层构架,如何在web以外的其它层使用log4net呢,比如DAL层,还要写相应的配置文件吗?

答案是否定的,在其它层中只要完成上面的1、4、5就行了,不需要再单独进行配置,它会自动沿用web层里的配置信息

三、如何防止自定义的logger和root重复写入日志

logger是从root继承而来,默认的用logger写的日志会被root重复写一份,如何防止这种情况呢,网上有人提出可以去掉root里的
appender-ref,这不是一个好的解决方法,logger只是为了单独处理一些日志,大部分的日志还是要依靠root来完成。

其实log4net提供了一种很好的解决方式,断开logger与root的继承关系,只要在配置文件里的logger加上属性additivity="false"
就可以了。

在log4net的配置中,appender是最重要的部分,一般来说,每一种appender都表示一种日志的输出介质,如日志文件、EvengLog、数据库、控制台、邮件、ASP.NET页面等。

本文对各种内置的appender的配置提供了示例,但却远称不上详尽。要想了解每一种appender的参数和选项的说明,请参看该appender的SDK文档。

以下示例都是.NET 2.0下进行的, log4net的版本为1.2.10。


AdoNetAppender


详情参考 log4net.Appender. AdoNetAppender SDK文档


AdoNetAppender的相关配置内容取决于目标数据库的provider。下面仅提供SQL Server 2000的例子。

首先建立数据表:

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>-->CREATE

TABLE

[
dbo
]
.
[
Log
]

(

[
Id
]

[
int
]

IDENTITY
(
1
,
1
)
NOT

NULL
,

[
Date
]

[
datetime
]

NOT

NULL
,

[
Thread
]

[
varchar
]
(
255
)
NOT

NULL
,

[
Level
]

[
varchar
]
(
50
)
NOT

NULL
,

[
Logger
]

[
varchar
]
(
255
)
NOT

NULL
,

[
Message
]

[
varchar
]
(
4000
)
NOT

NULL
,

[
Exception
]

[
varchar
]
(
2000
)
NULL

)

然后添加配置:

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="AdoNetAppender"
type
="log4net.Appender.AdoNetAppender"
>

<
bufferSize
value
="2"

/>

<
connectionType
value
="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089"

/>

<
connectionString
value
="server=(local);database=TestBase;integrated security=false;persist security info=True;UID=sa;PWD="

/>

<
commandText
value
="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"

/>

<
parameter
>

<
parameterName
value
="@log_date"

/>

<
dbType
value
="DateTime"

/>

<
layout
type
="log4net.Layout.RawTimeStampLayout"

/>

</
parameter
>

<
parameter
>

<
parameterName
value
="@thread"

/>

<
dbType
value
="String"

/>

<
size
value
="255"

/>

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

<
conversionPattern
value
="%thread"

/>

</
layout
>

</
parameter
>

<
parameter
>

<
parameterName
value
="@log_level"

/>

<
dbType
value
="String"

/>

<
size
value
="50"

/>

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

<
conversionPattern
value
="%level"

/>

</
layout
>

</
parameter
>

<
parameter
>

<
parameterName
value
="@logger"

/>

<
dbType
value
="String"

/>

<
size
value
="255"

/>

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

<
conversionPattern
value
="%logger"

/>

</
layout
>

</
parameter
>

<
parameter
>

<
parameterName
value
="@message"

/>

<
dbType
value
="String"

/>

<
size
value
="4000"

/>

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

<
conversionPattern
value
="%message"

/>

</
layout
>

</
parameter
>

<
parameter
>

<
parameterName
value
="@exception"

/>

<
dbType
value
="String"

/>

<
size
value
="2000"

/>

<
layout
type
="log4net.Layout.ExceptionLayout"

/>

</
parameter
>

</
appender
>

bufferSize
表示批处理的日志事件,可以避免每次日志事件都访问数据库;ConnectionType
指定了要使用的IDbConnection的完全限定类型名称;connectionString
表示连接字符串;CommandText
是SQL语句或存储过程;最后一组parameter
节点描述了SQL语句或存储过程需要的参数。

AspNetTraceAppender

详情参考 log4net.Appender.AspNetTraceAppender
SDK 文档


<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="AspNetTraceAppender"
type
="log4net.Appender.AspNetTraceAppender"

>

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

<
conversionPattern
value
="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"

/>

</
layout
>

</
appender
>

这段配置可将日志信息输出到页面的Trace上下文环境。如果日志的级别低于WARN,会以
System.Web.TraceContext.Write方法输出;如果级别为WARN或WARN以上则会以
System.Web.TraceContext.Warn方法输出,下图中的日志信息的不同颜色可以说明这一点。
效果图如下:



这在进行页面调试的时候可是很方便的。

BufferingForwardingAppender

详情参考 log4net.Appender.BufferingForwardingAppender
SDK 文档


<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="BufferingForwardingAppender"
type
="log4net.Appender.BufferingForwardingAppender"

>

<
bufferSize
value
="5"
/>

<
lossy
value
="true"

/>

<
evaluator
type
="log4net.Core.LevelEvaluator"
>

<
threshold
value
="WARN"
/>

</
evaluator
>

<
appender-ref
ref
="LogFileAppender"

/>

<
appender-ref
ref
="AspNetTraceAppender"

/>

</
appender
>

BufferingForwardingAppender的主要作用是将输出到指定类型(这里是LogFileAppender)的
Appender的日志信息进行缓存。bufferSize属性指定了缓存的数量,如果value为5,那么将在信息量达到6条的时候,把这些日志批量输
出。appender-ref属性指定了缓存的Appender类型,同root节点一样,这里可以指定多个。



ColoredConsoleAppender


详情参考log4net.Appender.ColoredConsoleAppender
SDK 文档


ColoredConsoleAppender将日志信息输出到控制台。默认情况下,日志信息被发送到控制台标准输出流。下面这个示例演示了如何高亮显示Error信息。

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="ColoredConsoleAppender"
type
="log4net.Appender.ColoredConsoleAppender"
>

<
mapping
>

<
level
value
="ERROR"

/>

<
foreColor
value
="White"

/>

<
backColor
value
="Red, HighIntensity"

/>

</
mapping
>

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

<
conversionPattern
value
="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"

/>

</
layout
>

</
appender
>

效果如下:



还可以为不同的级别指定不同的颜色:

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="ColoredConsoleAppender"
type
="log4net.Appender.ColoredConsoleAppender"
>

<
mapping
>

<
level
value
="ERROR"

/>

<
foreColor
value
="White"

/>

<
backColor
value
="Red, HighIntensity"

/>

</
mapping
>

<
mapping
>

<
level
value
="DEBUG"

/>

<
backColor
value
="Green"

/>

</
mapping
>

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

<
conversionPattern
value
="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"

/>

</
layout
>

</
appender
>

效果如下:





ConsoleAppender


详情参考 log4net.Appender.ConsoleAppender
SDK 文档


ConsoleAppender将日志信息输出到控制台标准输出流。

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="ConsoleAppender"
type
="log4net.Appender.ConsoleAppender"

>

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

<
param
name
="ConversionPattern"
value
="%d [%t] %-5p %c [%x] - %m%n"

/>

</
layout
>

</
appender
>

EventLogAppender

详情参考 log4net.Appender.EventLogAppender
SDK 文档


EventLogAppender将日志写入本地机器的应用程序事件日志中。默认情况下,该日志的源(Source)是AppDomain.FriendlyName,也可以手动指定其它名称。

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="EventLogAppender"
type
="log4net.Appender.EventLogAppender"

>

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

<
param
name
="ConversionPattern"
value
="%d [%t] %-5p %c [%x] - %m%n"

/>

</
layout
>

</
appender
>

FileAppender

详情参考 log4net.Appender.File
Appender SDK 文档


FileAppender将日志信息输出到指定的日志文件。

<!-- [if gte vml 1]>
<![endif]--><!-- [if !vml]-->

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="LogFileAppender"
type
="log4net.Appender.FileAppender"

>

<
param
name
="File"
value
="WebUtilClient.log"

/>

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

/>

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

<
param
name
="ConversionPattern"
value
="%d [%t] %-5p %c [%x] - %m%n"

/>

</
layout
>

</
appender
>

File指定了文件名称,可以使用相对路径,此时日志文件的位置取决于项目的类型(如控制台、Windows Forms、ASP.NET等);也可以使用绝对路径;甚至可以使用环境变量,如<file
value="${TMP}\log-file.txt" />。

AppendToFile指定是追加到还是覆盖掉已有的日志文件。

还可以添加如下属性<lockingModel
type="log4net.Appender.FileAppender+MinimalLock" />来使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件。

ForwardingAppender

详情参考 log4net.Appender.ForwardingAppender
SDK 文档


ForwardingAppender可以用来为一个Appender指定一组约束。看下面这个示例:

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="ForwardingAppender"
type
="log4net.Appender.ForwardingAppender"

>

<
threshold
value
="WARN"
/>

<
appender-ref
ref
="ConsoleAppender"

/>

</
appender
>

在这个示例中,为ConsoleAppender添加了约束,Threshold为WARN。这意味着对于一条日志信息,如果直接使用
ConsoleAppender,那么不论它是什么级别,总会进行输出,而如果使用这个ForwardingAppender,则只有那些WARN或
WARN以上的日志才会发送到ConsoleAppender。

MemoryAppender

详情参考 log4net.Appender.MemoryAppender
SDK 文档


似乎不应该使用配置文件来配置MemoryAppender,但如果你非要这么做,看看这个示例(未验证):

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="MemoryAppender"
type
="log4net.Appender.MemoryAppender"
>

<
onlyFixPartialEventData
value
="true"

/>

</
appender
>

NetSendAppender

详情参考 log4net.Appender.NetSendAppender
SDK 文档


NetSendAppender向特定用户的屏幕发送消息(未验证)。

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="NetSendAppender"
type
="log4net.Appender.NetSendAppender"
>

<
threshold
value
="ERROR"

/>

<
server
value
="Anders"

/>

<
recipient
value
="xym"

/>

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

<
conversionPattern
value
="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"

/>

</
layout
>

</
appender
>

OutputDebugStringAppender

详情参考 log4net.Appender.OutputDebugStringAppender
SDK 文档


下面这个例子描述了如何配置该Appender以向OutputDebugString API写入日志(未验证)。

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="OutputDebugStringAppender"
type
="log4net.Appender.OutputDebugStringAppender"

>

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

<
conversionPattern
value
="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"

/>

</
layout
>

</
appender
>

RemotingAppender

详情参考 log4net.Appender.RemotingAppender
SDK 文档


RemotingAppender向特定的Sink发送日志信息(未验证):

<!-- [if gte vml 1]><![endif]--><!-- [if !vml]-->

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="RemotingAppender"
type
="log4net.Appender.RemotingAppender"

>

<
sink
value
="tcp://localhost:8085/LoggingSink"

/>

<
lossy
value
="false"

/>

<
bufferSize
value
="95"

/>

<
onlyFixPartialEventData
value
="true"

/>

</
appender
>

RollingFileAppender

详情参考 log4net.Appender.RollingFileAppender
SDK 文档


RollingFileAppender以FileAppender为基础,与后者有着相同的配置选项。

下面这个例子演示了如何配置RollingFileAppender以写入log.txt文件。写入的文件名总是为
log.txt(StaticLogFileName参数指定为true);根据文件大小(RollingStyle)来生成新的文件;最多保存有10个
文件(MaxSizeRollBackups属性,而且一旦写满10个文件,就不再写入日志了),每个文件最大为10KB。这些文件名称为
log.txt.1, log.txt.2…等。

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><
appender
name
="RollingFileAppender"
type
="log4net.Appender.RollingFileAppender"
>

<
param
name
="File"
value
="log\Log.txt"

/>

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

/>

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

/>

<
param
name
="MaximumFileSize"
value
="5MB"

/>

<
param
name
="RollingStyle"
value
="Size"

/>

<
param
name
="StaticLogFileName"
value
="true"

/>

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

<
param
name
="ConversionPattern"
value
="%d [%t] %-5p %c [%x] - %m%n"

/>

</
layout
>

</
appender
>

SmtpAppender

详情参考 log4net.Appender.SmtpAppender
SDK 文档


SmtpAppender通过Smtp邮件服务器发送日志信息:

<!--
<br><br>Code highlighting produced by Actipro
CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
<
appender
name
="SmtpAppender"
type
="log4net.Appender.SmtpAppender"
>

<
authentication
value
="Basic"

/>

<
to
value
="anderscui@tom.com"

/>

<
from
value
="anderscui@163.com"

/>

<
username
value
="anderscui"

/>

<
password
value
="password"

/>

<
subject
value
="test logging message"

/>

<
smtpHost
value
="smtp.163.com"

/>

<
bufferSize
value
="512"

/>

<
lossy
value
="true"

/>

border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: