Log4net - 規則簡介

來源:互聯網
上載者:User

標籤:lin   http   精度控制   lis   smtp   mvc   windows   產生   部分   

參考頁面:

http://www.yuanjiaocheng.net/entity/createdatamodel.html

http://www.yuanjiaocheng.net/Spring/first.html

http://www.yuanjiaocheng.net/entity/modelbrowser.html

http://www.yuanjiaocheng.net/entity/dbcontext.html

http://www.yuanjiaocheng.net/mvc/first.html

項目過程中, 不可避免的, 需要使用到日誌功能. 在我接觸過的項目中, 也有自己弄一套日誌的, 但是更多的, 還是使用別人成熟的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

 發生日誌請求的原始碼檔案的名字

警告:只在調試的時候有效。調用本地資訊會影響效能。

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,DateTimeDateFormatterIso8601DateFormatter

例如: %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使用手冊 (這一篇都是從這裡拷貝過來的, 連結裡面更加詳細)

Log4net - 規則簡介

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.