解决log4net独占日志文件的问题以及 log4net的各种输出配置(Appender)
由于log4net默認(rèn)情況下會(huì)獨(dú)占日志文件,該文件不能被File.Open。
可以通過增加配置:<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />來使用最小鎖定模型(minimal locking model),以允許多個(gè)進(jìn)程可以寫入同一個(gè)文件。
各種appender說明:
在log4net的配置中,appender是最重要的部分,一般來說,每一種appender都表示一種日志的輸出介質(zhì),如日志文件、EvengLog、數(shù)據(jù)庫、控制臺、郵件、ASP.NET頁面等。
本文對各種內(nèi)置的appender的配置提供了示例,但卻遠(yuǎn)稱不上詳盡。要想了解每一種appender的參數(shù)和選項(xiàng)的說明,請參看該appender的SDK文檔。
AdoNetAppender
詳情參考 log4net.Appender. AdoNetAppender SDK文檔。
AdoNetAppender的相關(guān)配置內(nèi)容取決于目標(biāo)數(shù)據(jù)庫的provider。下面僅提供SQL Server 2000的例子。
首先建立數(shù)據(jù)表:
?
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
)
然后添加配置:
?
<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表示批處理的日志事件,可以避免每次日志事件都訪問數(shù)據(jù)庫;ConnectionType指定了要使用的IDbConnection的完全限定類型名稱;connectionString表示連接字符串;CommandText是SQL語句或存儲(chǔ)過程;最后一組parameter節(jié)點(diǎn)描述了SQL語句或存儲(chǔ)過程需要的參數(shù)。
?
AspNetTraceAppender?
詳情參考 log4net.Appender.AspNetTraceAppender SDK 文檔。??
<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上下文環(huán)境。如果日志的級別低于WARN,會(huì)以System.Web.TraceContext.Write方法輸出;如果級別為WARN或WARN以上則會(huì)以System.Web.TraceContext.Warn方法輸出,下圖中的日志信息的不同顏色可以說明這一點(diǎn)。效果圖如下:
這在進(jìn)行頁面調(diào)試的時(shí)候可是很方便的。
BufferingForwardingAppender
詳情參考 log4net.Appender.BufferingForwardingAppender SDK 文檔。<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的日志信息進(jìn)行緩存。bufferSize屬性指定了緩存的數(shù)量,如果value為5,那么將在信息量達(dá)到6條的時(shí)候,把這些日志批量輸出。appender-ref屬性指定了緩存的Appender類型,同root節(jié)點(diǎn)一樣,這里可以指定多個(gè)。
ColoredConsoleAppender?
詳情參考log4net.Appender.ColoredConsoleAppender SDK 文檔。
ColoredConsoleAppender將日志信息輸出到控制臺。默認(rèn)情況下,日志信息被發(fā)送到控制臺標(biāo)準(zhǔn)輸出流。下面這個(gè)示例演示了如何高亮顯示Error信息。<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>
效果如下:
還可以為不同的級別指定不同的顏色:
<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 文檔。
<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 文檔。
<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 !vml]-->
<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指定了文件名稱,可以使用相對路徑,此時(shí)日志文件的位置取決于項(xiàng)目的類型(如控制臺、Windows Forms、ASP.NET等);也可以使用絕對路徑;甚至可以使用環(huán)境變量,如<file value="${TMP}\log-file.txt" />。
AppendToFile指定是追加到還是覆蓋掉已有的日志文件。
還可以添加如下屬性<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />來使用最小鎖定模型(minimal locking model),以允許多個(gè)進(jìn)程可以寫入同一個(gè)文件。
ForwardingAppender?
詳情參考 log4net.Appender.ForwardingAppender SDK 文檔。
ForwardingAppender可以用來為一個(gè)Appender指定一組約束。看下面這個(gè)示例:
????<threshold?value="WARN"/>
????<appender-ref?ref="ConsoleAppender"?/>
</appender>
在這個(gè)示例中,為ConsoleAppender添加了約束,Threshold為WARN。這意味著對于一條日志信息,如果直接使用ConsoleAppender,那么不論它是什么級別,總會(huì)進(jìn)行輸出,而如果使用這個(gè)ForwardingAppender,則只有那些WARN或WARN以上的日志才會(huì)發(fā)送到ConsoleAppender。?
MemoryAppender
詳情參考 log4net.Appender.MemoryAppender SDK 文檔。
似乎不應(yīng)該使用配置文件來配置MemoryAppender,但如果你非要這么做,看看這個(gè)示例(未驗(yàn)證):
????<onlyFixPartialEventData?value="true"?/>
</appender>
NetSendAppender?
詳情參考 log4net.Appender.NetSendAppender SDK 文檔。
NetSendAppender向特定用戶的屏幕發(fā)送消息(未驗(yàn)證)。
????<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 文檔。?
下面這個(gè)例子描述了如何配置該Appender以向OutputDebugString API寫入日志(未驗(yàn)證)。
?
<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發(fā)送日志信息(未驗(yàn)證):
<!--[if !vml]-->
<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為基礎(chǔ),與后者有著相同的配置選項(xiàng)。
下面這個(gè)例子演示了如何配置RollingFileAppender以寫入log.txt文件。寫入的文件名總是為log.txt(StaticLogFileName參數(shù)指定為true);根據(jù)文件大小(RollingStyle)來生成新的文件;最多保存有10個(gè)文件(MaxSizeRollBackups屬性,而且一旦寫滿10個(gè)文件,就不再寫入日志了),每個(gè)文件最大為10KB。這些文件名稱為log.txt.1, log.txt.2…等。
????<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郵件服務(wù)器發(fā)送日志信息:
????????????<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"?/>
????????????<evaluator?type="log4net.Core.LevelEvaluator">
????????????????<threshold?value="WARN"/>
????????????</evaluator>
????????????<layout?type="log4net.Layout.PatternLayout">
????????????????<conversionPattern?value="%newline%date?[%thread]?%-5level?%logger?[%property{NDC}]?-?%message%newline%newline%newline"?/>
????????????</layout>
????????</appender>
將其中的to、from、username、password、subject、smtpHost配置正確才可能發(fā)送成功。bufferSize可將多條信息打包在一個(gè)郵件中。evaluator可以對日志進(jìn)行過濾。
SmtpPickupDirAppender
詳情參考 log4net.Appender.SmtpPickupDirAppender SDK 文檔。
配置與SmtpAppender類似,但要把SmtpHost換為PickupDir(未驗(yàn)證)。
????<to?value="to@domain.com"?/>
????<from?value="from@domain.com"?/>
????<subject?value="test?logging?message"?/>
????<pickupDir?value="C:\SmtpPickup"?/>
????<bufferSize?value="512"?/>
????<lossy?value="true"?/>
????<evaluator?type="log4net.Core.LevelEvaluator">
????????<threshold?value="WARN"/>
????</evaluator>
????<layout?type="log4net.Layout.PatternLayout">
????????<conversionPattern?value="%newline%date?[%thread]?%-5level?%logger?[%property{NDC}]?-?%message%newline%newline%newline"?/>
????</layout>
</appender>
TraceAppender
詳情參考 log4net.Appender.TraceAppender SDK 文檔。
TraceAppender將日志信息寫入System.Diagnostics.Trace系統(tǒng)(出現(xiàn)在輸出窗口)。
????<layout?type="log4net.Layout.PatternLayout">
????????<conversionPattern?value="%date?[%thread]?%-5level?%logger?[%property{NDC}]?-?%message%newline"?/>
????</layout>
</appender>
UdpAppender
詳情參考 log4net.Appender.UdpAppender SDK 文檔。
下例演示了如何配置UdpAppender(未驗(yàn)證):<appender?name="UdpAppender"?type="log4net.Appender.UdpAppender">
????<localPort?value="8080"?/>
????<remoteAddress?value="224.0.0.1"?/>
????<remotePort?value="8080"?/>
????<layout?type="log4net.Layout.PatternLayout,?log4net">
????????<conversionPattern?value="%-5level?%logger?[%property{NDC}]?-?%message%newline"?/>
????</layout>
</appender>
上面有若干個(gè)Appender標(biāo)注為"未驗(yàn)證"的,是指這些Appender極少用到,或者在我的機(jī)器上沒能實(shí)現(xiàn) :(
希望這些內(nèi)容能對您有所幫助。
轉(zhuǎn)載于:https://www.cnblogs.com/gllgsoft/archive/2008/11/24/1339778.html
總結(jié)
以上是生活随笔為你收集整理的解决log4net独占日志文件的问题以及 log4net的各种输出配置(Appender)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++入门必备系列
- 下一篇: 手把手教你怎么用动软.net代码生成器