Log4Net五步走
Log4Net主頁: http://logging.apache.org/log4net/ ,下載Log4Net
Log4Net主要由Logger, Appender, Filter, Layout 4個組件構成, 一般情況下后3個組件在配置文件中配置.
1. LogNet工程引用log4net.dll
2.定義配置文件,可以配置在web.config,也可以單獨配置在xml文件里面
3.雙擊打開AssemblyInfo.cs在最后添加
[assembly: log4net.Config.XMLConfigurator(ConfigFile = “log4net.config”, Watch = true)]
3.創建或獲取日志對象
log4net.ILog log = log4net.LogManager.GetLogger(”logger-name”);
可以定義多個log對象,每個log對象分別取配置文件不同的<logger>標記,每個<logger>分別取不同的appender
這樣就可以用不同的log對象把日志輸出到不同的文件或者其它介質,
4.輸出日志信息
log.debug()
Log4net主要由五個部分組成,分別為Logger,Appenders, Filters, Layouts 和Object Renders。
一、Logger(日志)
1. 記錄日志的分類:
Log4net能夠以多種方式輸出日志。支持的日志輸出常用的主要媒介有數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制臺,文件,事件日志(可以用事件查看器查看)和郵件等多種方式。
2. 日志的級別
Log4net支持多種級別的日志。優先級從高到低依次排列如下:
FATAL > ERROR > WARN > INFO > DEBUG
此外還有ALL(允許所有的日志請求)和OFF(拒絕所有的日志請求)這兩種特殊的級別。
二、Appenders
Appenders決定日志輸出的方式。
Appenders必須實現log4net.Appenders.IAppender接口。
Log4net目前支持的輸出方式包括:
1、AdoNetAppender
將日志記錄到數據庫中。可以采用SQL和存儲過程兩種方式。
2、AnsiColorTerminalAppender
在ANSI 窗口終端寫下高亮度的日志事件。
3、AspNetTraceAppender
能用asp.net中Trace的方式查看記錄的日志。
4、BufferingForwardingAppender
在輸出到子Appenders之前先緩存日志事件。
5、ConsoleAppender
將日志輸出到控制臺。
6、EventLogAppender
將日志寫到Windows Event Log.
7、FileAppender
將日志寫到文件中。
8、LocalSyslogAppender
將日志寫到local syslog service (僅用于UNIX環境下).
9、MemoryAppender
將日志存到內存緩沖區。
10、NetSendAppender
將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。
11、RemoteSyslogAppender
通過UDP網絡協議將日志寫到Remote syslog service。
12、RemotingAppender
通過.NET Remoting將日志寫到遠程接收端。
13、RollingFileAppender
將日志以回滾文件的形式寫到文件中。
14、SmtpAppender
將日志寫到郵件中。
15、TraceAppender
將日志寫到.NET trace 系統。
16、UdpAppender
將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。
三、Filters
Appender對象將日志以缺省的方式傳到輸出流,然后Filter可以按照不同的標準控制日志的輸出。Filter可以再配置文件中配置。最簡單的形式是在appender中寫明一個Threshold.這樣只有級別大于或等于此Threshold的日志才被記錄。
Filters必須實現log4net.Filters.IFilter接口。
四、Layouts
Layouts控制日志顯示的格式樣式。日志的顯示格式如下:
"%timestamp [%thread] %-5level %logger - %message%newline"
Timestamp: 表示程序已經開始執行的時間。 單位[毫秒]。
Thread:執行當前代碼的線程。
Level:日志的級別。
Logger:日志相關請求的名稱。
Message: 日志消息。
Layouts還可以控制日志的輸出樣式,比如以普通形式或以xml等形式輸出。
五、Object Renderers
這是很重要的一項,log4net將按照用戶定義的標準輸出日志消息。
Object Renders必須實現log4net.ObjectRenderer.IObjectRenerer接口
Logger
負責產生日志消息,可以在代碼中調用
Logger的Level屬性可以設以下值,由高到低為OFF,FATAL,
ERROR,WARN,INFO,DEBUG,ALL. 高于設定值方法都能寫入日志,
Off所有的寫入方法都不寫到日志里,ALL則相反。例如當我們設成Info時,logger.Debug就會被忽略而不寫入文件,但是FATAL,
ERROR,WARN,INFO會被寫入,因為他們等級高于INFO;
Appender
負責向存儲介質中追加日志, 一般在配置文件中配置,根據保存日志介質的不同Appender有多種,
比如:AdoNetAppender,EventLogAppender,RollingFileAppender等.參見:
http://logging.apache.org/log4net/release/config-examples.HTML
.
Filter
負責過濾日志, 一般和Appender聯合使用,在配置文件中配置
Layout
負責日志消息的格式, 一般和Appender聯合使用,在配置文件中配置。
----------------------------------------------------------------------
log4net標簽的框架如下, 該標簽下有root, logger, appender等標簽
root標簽
所有的logger都從root繼承, root本身也是一個logger
logger標簽
每個logger標簽代表一個logger,appender-ref表示該logger產生的日志消息傳遞給哪個appender,一個logger可以把相同的消
息傳遞給多個appender記錄
appender標簽
每個appender表示一個日志的存儲位置,name不能和type一樣
設定參數
日志根據日期滾動
日志文件名格式為
日志文件名是否是固定不變的
layout type="log4net.Layout.PatternLayout"
日志消息的格式, 表示換行
param name=”ConversionPattern” value=”%d [%t] %-5p %c - %m%n”
param name=”Header” value=” ———————-header————————– ”
param name=”Footer” value=” ———————-footer————————– ”
%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息
%n(new line):換行
%d(datetime):輸出當前語句運行的時刻
%r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數
%t(thread id):當前語句所在的線程ID
%p(priority): 日志的當前優先級別,即DEBUG、INFO、WARN…等
%c(class):當前日志對象的名稱
%L:輸出語句所在的行號
%F:輸出語句所在的文件名
%-數字:表示該項的最小長度,如果不夠,則用空格填充
-------------------------------------------------------------------------------------------------------------------------------------
log4net>
<loggername="loggerAX">
<!--controlloglevel:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<!--如果沒有定義LEVEL的值,則缺省為DEBUG-->
<levelvalue="ALL"/>
<appender-refref="SmtpAppenderAX"></appender-ref>
<appender-refref="FileAppenderAX"></appender-ref>
</logger>
<appendername="SmtpAppenderAX"type="log4net.Appender.SmtpAppender">
<tovalue="AXzhz@163.com"></to>
<fromvalue="AXzhz@163.com"/>
<subjectvalue="AX'TestLogMessage"/>
<smtpHostvalue="smtp.163.com"/>
<usernamevalue="AXzhz"/>
<passwordvalue="110"/>
<bufferSizevalue="2048"/>
<!--超長部分是否丟棄-->
<lossyvalue="false"/>
<!--evaluator時好時壞,靠不住,還是用filter實在-->
<!--<evaluatortype="log4net.Core.LevelEvaluator">
<thresholdvalue="ERROR"/>
</evaluator>-->
<!--<evaluatortype="log4net.Core.LevelEvaluator,log4net">
<thresholdvalue="WARN"/>
</evaluator>-->
<!--將導致不能寫日志-->
<!--<filtertype="log4net.Filter.DenyAllFilter"/>-->
<!--輸出級別在WARN和OFF之間的日志-->
<filtertype="log4net.Filter.LevelRangeFilter">
<paramname="LevelMin"value="WARN"/>
<paramname="LevelMax"value="OFF"/>
</filter>
<layouttype="log4net.Layout.PatternLayout">
<conversionPatternvalue="%newline%date[%thread]%-5level%logger[%property{NDC}]:%newline%message%newline"/>
</layout>
</appender>
<appendername="FileAppenderAX"type="log4net.Appender.RollingFileAppender">
<!--絕對路徑-->
<filevalue="D://AX.txt"></file>
<!--相對路徑,在項目的根目錄下-->
<!--以最后一個路徑為準,所以上面的絕對路徑下不會寫日志-->
<filevalue="./Log/AX.txt"></file>
<!--防止多線程時不能寫Log,官方說線程非安全-->
<!--實際使用時,本地測試正常,部署后有不能寫日志的情況-->
<lockingModeltype="log4net.Appender.FileAppender+MinimalLock"/>
<appendToFilevalue="true"/>
<!--可以為:Once|Size|Date|Composite-->
<!--Composite為Size和Date的組合-->
<rollingStylevalue="composite"/>
<!--日志最大個數,都是最新的-->
<!--rollingStyle節點為Date時,該節點不起作用-->
<!--rollingStyle節點為Size時,只能有value個日志-->
<!--rollingStyle節點為Composite時,每天有value個日志-->
<maxSizeRollBackupsvalue="10"/>
<!--當備份文件時,為文件名加的后綴-->
<!--后綴為*.txt時,例:AX.txt_2008-07-24.PxP應該是程序上的一個bug-->
<!--后綴為*.TXT時,例:AX.txt_2008-07-25.TXT-->
<datePatternvalue="_yyyy-MM-dd.TXT"/>
<!--可用的單位:KB|MB|GB-->
<!--不要使用小數,否則會一直寫入當前日志-->
<maximumFileSizevalue="1KB"/>
<!--置為true,當前最新日志文件名永遠為file節中的名字-->
<staticLogFileNamevalue="true"/>
<!--輸出級別在INFO和ERROR之間的日志-->
<filtertype="log4net.Filter.LevelRangeFilter">
<paramname="LevelMin"value="INFO"/>
<paramname="LevelMax"value="ERROR"/>
</filter>
<!--必須結合起來用,第一個只過濾出WARN,第二個拒絕其它其它日志輸出-->
<filtertype="log4net.Filter.LevelMatchFilter">
<paramname="LevelToMatch"value="WARN"/>
</filter>
<filtertype="log4net.Filter.DenyAllFilter"/>
<layouttype="log4net.Layout.PatternLayout">
<conversionPatternvalue="%date[%thread]%-5level%logger[%ndc]-%message%newline"/>
</layout>
</appender>
</log4net>
<!--==================================layout節點的配置說明==================================-->
<!--MadeByAX-->
<!--%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息-->
<!--%n(newline):換行-->
<!--%d(datetime):輸出當前語句運行的時刻-->
<!--%r(runtime):輸出程序從運行到執行到當前語句時消耗的毫秒數-->
<!--%t(threadid):當前語句所在的線程ID-->
<!--%p(priority):日志的當前優先級別,即DEBUG、INFO、WARN…等-->
<!--%c(class):當前日志對象的名稱,例如:-->
<!--模式字符串為:%-10c-%m%n-->
<!--代碼為:-->
<!--ILoglog=LogManager.GetLogger(“Exam.Log”);-->
<!--log.Debug(“Hello”);-->
<!--則輸出為下面的形式:-->
<!--Exam.Log-Hello-->
<!--%L:輸出語句所在的行號-->
<!--%F:輸出語句所在的文件名-->
<!--%-數字:表示該項的最小長度,如果不夠,則用空格填充-->
<!--例如,轉換模式為%r[%t]%-5p%c-%m%n的PatternLayout將生成類似于以下內容的輸出:-->
<!--176[main]INFOorg.foo.Bar-Locatednearestgasstation.-->
<!---->
<!--========================================================================================-->
Ⅲ.在Default.aspx.cs的Page_Load里添加如下代碼.
protectedvoidPage_Load(objectsender,EventArgse)
{
//下面兩句應該放在網站剛剛啟動時加載,并放在一個靜態方法里方便調用
log4net.Config.XmlConfigurator.ConfigureAndWatch(newSystem.IO.FileInfo(Server.MapPath("Log4Net_AX.config")));
ILoglogAX=LogManager.GetLogger("loggerAX");
//寫日志
logAX.Error("ErrorAX");
logAX.Info("InfoAX");
}
F5,在項目目錄下找到Log文件夾的AX.txt ,這個就是剛剛生成的日志文件.
【寫日志的原則】
Ⅰ.在catch后,把異常寫入日志.
Ⅱ.在調用第三方控件的開始和結束處.
Ⅲ.在連接數據庫的開始結束處.
Ⅳ.除非必要,不要在循環體中加入日志,否則一旦出問題可能導致日志暴增.
Ⅴ.在自己認為很重要的邏輯處寫入日志.
【注意】
發現有重要問題時最好用郵件日志,但不要指望上面的郵件配置節能發日志.
要使用能用的smtp服務器,163的只有部分用戶能
用.我的就不能用,很是郁悶.
要合理配置下列參數.
Ⅰ.日志文件的大小
Ⅱ.備份的日志名樣式,最好時間精確到分---------------------------------------------------------------------------------------------------------------------------------------
因為工作中有要用到Log記錄,找到一篇不錯的文章,就轉了過來。 一 Log4net簡介 Log4net是基于.net開發的一款非常著名的記錄日志開源組件。他最早是2001年7月由NeoWorks Limited啟動的項目,基本的框架源于另外的一個非常著名的姐妹組件-log4j。Log4net記錄日志的功能非常強大。它可以將日志分不同的等級,比不同的樣式,將日志輸出到不同的媒介。 Log4net可以從 http://logging.apache.org/log4net/downloads.html 網站下載最新版本。 二 Log4net核心組成 Log4net主要由五個部分組成,分別為Logger,Appenders, Filters, Layouts 和Object Renders。 一)Logger(日志) 1. 記錄日志的分類: Log4net能夠以多種方式輸出日志。支持的日志輸出常用的主要媒介有數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite,控制臺,文件,事件日志(可以用事件查看器查看)和郵件等多種方式。 2. 日志的級別 Log4net支持多種級別的日志。優先級從高到低依次排列如下: FATAL > ERROR > WARN > INFO > DEBUG 此外還有ALL(允許所有的日志請求)和OFF(拒絕所有的日志請求)這兩種特殊的級別。 二)Appenders Appenders決定日志輸出的方式。 Appenders必須實現log4net.Appenders.IAppender接口。 Log4net目前支持的輸出方式包括: 1 AdoNetAppender 將日志記錄到數據庫中。可以采用SQL和存儲過程兩種方式。 2 AnsiColorTerminalAppender 在ANSI 窗口終端寫下高亮度的日志事件。 3 AspNetTraceAppender 能用asp.net中Trace的方式查看記錄的日志。 4 BufferingForwardingAppender 在輸出到子Appenders之前先緩存日志事件。 5 ConsoleAppender 將日志輸出到控制臺。 6 EventLogAppender 將日志寫到Windows Event Log. 7 FileAppender 將日志寫到文件中。 8 LocalSyslogAppender 將日志寫到local syslog service (僅用于UNIX環境下). 9 MemoryAppender 將日志存到內存緩沖區。 10 NetSendAppender 將日志輸出到Windows Messenger service.這些日志信息將在用戶終端的對話框中顯示。 11 RemoteSyslogAppender 通過UDP網絡協議將日志寫到Remote syslog service。 12 RemotingAppender 通過.NET Remoting將日志寫到遠程接收端。 13 RollingFileAppender 將日志以回滾文件的形式寫到文件中。 14 SmtpAppender 將日志寫到郵件中。 15 TraceAppender 將日志寫到.NET trace 系統。 16 UdpAppender 將日志connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。 三)Filters Appender對象將日志以缺省的方式傳到輸出流,然后Filter可以按照不同的標準控制日志的輸出。Filter可以再配置文件中配置。最簡單的形式是在appender中寫明一個Threshold.這樣只有級別大于或等于此Threshold的日志才被記錄。 Filters必須實現log4net.Filters.IFilter接口。 四)Layouts Layouts控制日志顯示的格式樣式。日志的顯示格式如下: "%timestamp [%thread] %-5level %logger - %message%newline" Timestamp: 表示程序已經開始執行的時間。 單位[毫秒]。 Thread:執行當前代碼的線程。 Level:日志的級別。 Logger:日志相關請求的名稱。 Message: 日志消息。 Layouts還可以控制日志的輸出樣式,比如以普通形式或以xml等形式輸出。 五)Object Renderers 這是很重要的一項,log4net將按照用戶定義的標準輸出日志消息。 Object Renders必須實現log4net.ObjectRenderer.IObjectRenerer接口。 三 如何在項目中使用log4net 下面有個基于控制臺的demo,舉例描述了log4net怎么用于輸出日志。 本例中,日志將會記錄到文件,控制臺,事件日至和Access數據庫中。 一)主要代碼: 1. 配置文件app.config 1<?xml version="1.0" encoding="utf-8" ?> 2<configuration> 3 <!-- Register a section handler for the log4net section --> 4 <configSections> 5 <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> 6 </configSections> 7 <appSettings> 8 <!-- To enable internal log4net logging specify the following appSettings key --> 9 <!-- <add key="log4net.Internal.Debug" value="true"/> --></appSettings> 10 <!-- This section contains the log4net configuration settings --> 11 <log4net> 12 <!--定義輸出到文件中--> 13 <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 14 <!--定義文件存放位置--> 15 <file value="D:/log-file1.txt" /> 16 <!-- Example using environment variables in params --> 17 <!-- <file value="${TMP}/log-file.txt" /> --> 18 <!--<sppendToFile value="true" />--> 19 <!-- An alternate output encoding can be specified --> 20 <!-- <encoding value="unicodeFFFE" /> --> 21 <layout type="log4net.Layout.PatternLayout"> 22 <!--每條日志末尾的文字說明--> 23 <footer value="[Footer]--Test By Ring1981 " /> 24 <!--輸出格式--> 25 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" /> 26 </layout> 27 </appender> 28 <!--定義輸出到控制臺命令行中--> 29 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 30 <layout type="log4net.Layout.PatternLayout"> 31 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 32 </layout> 33 </appender> 34 <!--定義輸出到windows事件中--> 35 <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 36 <layout type="log4net.Layout.PatternLayout"> 37 <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 38 </layout> 39 </appender> 40 <!--定義輸出到數據庫中,這里舉例輸出到Access數據庫中,數據庫為D盤的access.mdb--> 41 <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> 42 <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/access.mdb" /> 43 <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> 44 <!--定義各個參數--> 45 <parameter> 46 <parameterName value="@log_date" /> 47 <dbType value="String" /> 48 <size value="255" /> 49 <layout type="log4net.Layout.PatternLayout"> 50 <conversionPattern value="%date" /> 51 </layout> 52 </parameter> 53 <parameter> 54 <parameterName value="@thread" /> 55 <dbType value="String" /> 56 <size value="255" /> 57 <layout type="log4net.Layout.PatternLayout"> 58 <conversionPattern value="%thread" /> 59 </layout> 60 </parameter> 61 <parameter> 62 <parameterName value="@log_level" /> 63 <dbType value="String" /> 64 <size value="50" /> 65 <layout type="log4net.Layout.PatternLayout"> 66 <conversionPattern value="%level" /> 67 </layout> 68 </parameter> 69 <parameter> 70 <parameterName value="@logger" /> 71 <dbType value="String" /> 72 <size value="255" /> 73 <layout type="log4net.Layout.PatternLayout"> 74 <conversionPattern value="%logger" /> 75 </layout> 76 </parameter> 77 <parameter> 78 <parameterName value="@message" /> 79 <dbType value="String" /> 80 <size value="1024" /> 81 <layout type="log4net.Layout.PatternLayout"> 82 <conversionPattern value="%message" /> 83 </layout> 84 </parameter> 85 </appender> 86 <!--定義日志的輸出媒介,下面定義日志以四種方式輸出。也可以下面的按照一種類型或其他類型輸出。--> 87 <root> 88 <appender-ref ref="LogFileAppender" /> 89 <appender-ref ref="ConsoleAppender" /> 90 <appender-ref ref="EventLogAppender" /> 91 <appender-ref ref="AdoNetAppender_Access" /> 92 </root> 93 </log4net> 94</configuration> 2. LoggingExample.cs 1// Configure log4net using the .config file 2[assembly: log4net.Config.XmlConfigurator(Watch=true)] 3// This will cause log4net to look for a configuration file 4// called ConsoleApp.exe.config in the application base 5// directory (i.e. the directory containing ConsoleApp.exe) 6 7namespace ConsoleApp 8{ 9 using System; 10 11 /**//// <summary> 12 /// Example of how to simply configure and use log4net 13 /// </summary> 14 public class LoggingExample 15 { 16 private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 17 18 public static void Main(string[] args) 19 { 20 log.Error("Error Acc"); 21 log.Fatal("Fatle Acc"); 22 System.Console.ReadLine(); 23 24 } 25 26 } 27} 28 運行程序,日志就會以xml中定義的四種媒介形式輸出。
場景:我想用log4net輸出兩個log文件,一個文件輸出所有的log,例如debug,info,warn,error,fatal全部輸出, 另外一個log文件只輸出error級別的log。 困擾了一段時間,開始還以為沒有這樣的功能,仔細看log4.net的文檔發現是可以的。 其他地方省略了,重點看紅色標出部分。這樣的話同一個地方寫入LOG,就會根據不同的級別輸出到不同的文件中。 下面是配置文件
|
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
