項目過程中, 不可避免的, 需要使用到日誌功能. 在我接觸過的項目中, 也有自己弄一套日誌的, 但是更多的, 還是使用別人成熟的dll, 比如log4. log4相關的文檔, 真是非常的多, 也非常的全, 但是本著溫故而知新的目的, 還是想把這個過一遍. 先放一個小Demo在上面 主要有五個組成部分 ...
項目過程中, 不可避免的, 需要使用到日誌功能. 在我接觸過的項目中, 也有自己弄一套日誌的, 但是更多的, 還是使用別人成熟的dll, 比如log4.
log4相關的文檔, 真是非常的多, 也非常的全, 但是本著溫故而知新的目的, 還是想把這個過一遍.
先放一個小Demo在上面
<appender name="TraceLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs\trace.txt" /> <MaxSizeRollBackups value="20" /> <StaticLogFileName value="false" /> <DatePattern value="yyyyMMdd'.txt'" /> <RollingStyle value="Size" /> <MaximumFileSize value="10MB"/> <appendToFile value="true" /> <layout type="log4net.Layout.PatternLayout"> <header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> <footer value="[END LOGGING AT %date]%newline%newline" type="log4net.Util.PatternString" /> <ConversionPattern value="%d [%t] %-5p %c - %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter,log4net"> <levelMin value="DEBUG" /> <levelMax value="INFO" /> </filter> </appender>
主要有五個組成部分: Appenders, Filters, Layouts, Loggers, Object Renders
1. Appenders
用來定義日誌的輸出方式. 可以通過配置Filters和Layout來實現日誌的過濾和輸出格式.
他的輸出方式有很多種, 這裡主要介紹幾種項目中最常用的.
AdoNetAppender | 將日誌記錄到資料庫中 |
FileAppender | 將日誌輸出到文件 |
RollingFileAppender | 將日誌以回滾文件的形式寫到文件中 |
SmtpAppender | 將日誌寫到郵件中 |
2. Filters
過濾器可以過濾掉Appender輸出的內容.
DenyAllFilter | 阻止所有的日誌事件被記錄 |
LevelMatchFilter | 只有指定等級的日誌事件才被記錄 |
LevelRangeFilter | 日誌等級在指定範圍內的事件才被記錄 |
LoggerMatchFilter | Logger名稱匹配,才記錄 |
PropertyFilter | 消息匹配指定的屬性值時才被記錄 |
StringMathFilter | 消息匹配指定的字元串才被記錄 |
3. Layouts
用於控制Appender的輸出格式, 可以使線性的, 也可以使Xml. 但是一個Appender只能有個一個Layout. 配置了這個之後, 可以不用在程式中再去自定義一個格式了.
最常用的, 應該還是自定義格式的PatternLayout. 接下來看一下 ConversionPattern 裡面的格式和意義
<ConversionPattern value="%d [%t] %-5p %c - %m%n" />
a appdomain |
引發日誌事件的應用程式域的名稱 |
c (小寫) logger |
記錄日誌事件的Logger對象的名字 可以使用精度說明符控制Logger的名字的輸出層級, 預設輸出全名 註意,精度符的控制是從右開始的。例如:logger 名為 "a.b.c", 輸出模型為 %logger{2} ,將輸出"b.c" |
C (大寫) class type |
引發日誌請求的類的全名 可以使用精度控制符. 例如: 類名是 "log4net.Layout.PatternLayout", 格式模型是 %type{1}將輸出"PatternLayout"。(也是從右開始的。) 警告:會影響性能。 |
d date |
記錄當前本地時間. 如 %d{HH:mm:ss,fff} 或 %d{dd MMM yyyy HH:mm:ss,fff} 建議還是使用自定義格式的時間吧. |
exception |
異常信息 日誌中必須存一個異常對象, 如果日誌事件不包含沒有異常對象, 那麼什麼也輸出不了. 異常輸出完畢後, 會跟一個換行. 一般會在輸出異常前加一個換行, 並將異常放在最後. |
F file |
發生日誌請求的源代碼文件的名字 警告:只在調試的時候有效。調用本地信息會影響性能。 |
U identity |
當前活動用戶的名字(Principal.Identity.Name). 警告:會影響性能。(我測試的時候%identity返回都是空的。) |
l (L的小寫) location |
引發日誌事件的方法(包括命名空間和類名),以及所在的源文件和行號。 警告:會影響性能。沒有pdb文件的話,只有方法名,沒有源文件名和行號。 |
L p level |
日誌等級 |
line | 引發日誌的行號 |
m message |
由應用程式提供給日誌的消息 |
M method |
發生日誌請求的方法名(只有方法名而已)。 警告:會影響性能。 |
X mdc P property propertites |
輸出事件的特殊屬性。例如: %property{user} 輸出user屬性。 屬性是由loggers或appenders添加到時間中的。 有一個預設的屬性"DE<log4net:HostName"總是會有。 DE<%property將輸出所以的屬性 。 |
n newline |
換行符 |
r timestamp |
從程式啟動到事件發生所經過的毫秒數。 |
t thread |
引發日誌事件的線程,如果沒有線程名就使用線程號。 |
w 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。 |
x ndc |
NDC (nested diagnostic context) |
% |
%%輸出一個百分號 |
上面demo中的-5是什麼意思呢? 接著看
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之間,少了在右邊補空格,多了截斷。 |
4. Loggers
Logger是直接和應用程式交互的組件. Logger只是產生日誌, 然後由它引用的Appender記錄到指定的地方, 並有Layout控制輸出格式.
Logger提供了多種方式來記錄一個日誌消息, 也可以有多個Logger同時存在. 每個實例化的Logger對象被log4net作為命名實體來維護.
log4net使用繼承體系, 兩個Logger, a 和 a.b, a是a.b的祖先. 每個Logger都繼承了它祖先的屬性.
日誌的等級有如下幾級:
OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL.
5. Object Renders
我對Object Renders的理解是這樣的。它將告訴logger如何把一個對象轉化為一個字元串記錄到日誌里。(你可能註意到了,ILog中定義的介面接收的參數是Object,而不是String。)
例如你想把Orange對象記錄到日誌中,但此時logger只會調用Orange預設的ToString方法而已。所以要定義一個OrangeRender類實現log4net.ObjectRender.IObjectRender介面,然後註冊它。這時logger就會知道如何把Orange記錄到日誌中了。
不過我沒有測試過,具體怎麼做還是看文檔吧。
參考:
log4net使用手冊 (這一篇都是從這裡拷貝過來的, 鏈接裡面更加詳細)