2011-02-20 134 views
7

我知道在NLOG內建像跟蹤,信息的一些日誌級別,致命等NLOG和自定義級別

我要定義一些新的如「DBLOG」,並只能與DBLOG配置所有日誌針對某個目標。

有沒有辦法做到這一點?或者我必須定義一個自定義日誌?

回答

20

@SemVanmeenen是正確的,NLog不允許添加自定義級別(即擴展LogLevel類中的可能值)。另外,考慮到級別的工作方式,至少在NLog中,每個級別通常表示消息的優先級。因此,如果您將一些(或全部)記錄器配置爲只記錄錯誤和更高級別的消息,則任何跟蹤,調試,信息和警告消息都不會被記錄。 DBLog級別在哪裏適合?看起來這更像是一個「類別」(可能有點類似於記錄器的名字),而不是一個級別。

你真的需要一個特殊的級別(或多個)來記錄像「DBLog」這樣的東西嗎?爲什麼不在你的配置文件中定義另一個名爲「DBLog」的記錄器?這樣,您可以使用篩選和目標將這些日誌發送到特定目標或打開或關閉該日誌記錄器。 See this link for some examples of stuff you can do with NLog configuration.

一個在NLOG和log4net的最常見的模式是讓每個類別的記錄,像這樣:

class MyClass 
{ 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

你也可以隨心所欲的使用記錄器名稱:

class MyDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

class MyOtherDbClass 
{ 
    private static readonly Logger logger = LogManager.GetLogger("DbStuff"); 

    public void DoSomething(int x, int y); 
    { 
    logger.Info("Doing something. x = {0}, y = {1}", x, y); 

    //Or 

    logger.Log(LogLevel.Info, "Doing something. x = {0}, y = {1}", x, y); 
    } 
} 

在第二個例子中,兩個類都使用相同的記錄器(「DbStuff」),並且都可以基於該記錄器名稱來控制(日誌級別,目標等)。

你也可以在同一個類中使用不同的記錄器(也許默認情況下你使用「每類」記錄器風格,但你也可以定義一些「交叉切割」記錄器,以便於記錄和控制類似的信息跨班級)。您可能有一個名爲「SQL」或「PERFORMANCE」的記錄器,您偶爾會使用它來記錄您希望在除班級以外的級別控制的特定信息。

使用不同的記錄器名稱,您當然可以將記錄消息路由到不同的目標,而無需定義新的日誌級別。

如果這沒有幫助,也許你可以在你的問題上詳細說明你想要做什麼。你希望你能寫什麼樣的日誌代碼,你覺得你現在不能寫?

[UPDATE]

<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> 
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> 
<logger name="Name.Space.*" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Warn" writeTo="f3,f4" /> 
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> 

假設F1,F2,F3和F4是文件的目標。

第1行將導致Class1的記錄器寫入調試和更高級別消息的f1目標(即Trace將被跳過)。

線路2將引起記錄器用於Class1的寫入F1目標ONLY調試和錯誤級別的消息(即跟蹤,信息,警告,以及致命將被跳過)

3號線將導致對於所有的記錄器命名空間Name.Space中的類可以寫入目標f3和f4,而不管級別如何。

4號線將導致所有類的記錄器在命名空間Name.Space寫入到目標F3和F4只有當日志級別爲警告或更高(即跟蹤,調試和信息將被跳過)

第5行將導致名稱空間Name.Space中所有類的記錄器拒絕其級別介於Debug和Error之間的任何消息。它們被拒絕是因爲沒有writeTo子句。由於final=true

這些示例顯示瞭如何在記錄器級別進行過濾,因此沒有爲記錄器處理更多規則。您可以使用FilteringTargetWrapper在目標級別執行進一步的篩選。我還沒有使用它,但有此配置FilteringTargetWrapper的例子:我有這些例子指出,隨着NLOG 1.0刷新安裝附帶的幫助文件的
Most useful NLog configurations

。我還沒有安裝NLog 2.0,因爲我正處於一個項目的中間,寧願等到NLog 2.0超出測試階段才能進入它。如果您使用NLog 2.0並且幫助文件沒有比NLog網站更好的示例,那麼您可以考慮至少安裝NLog 1.0幫助。你可以在這裏得到NLog 1.0的幫助:http://nlog.codeplex.com/releases/view/32601

+0

問題是我有一個服務器的連接我爲每個「連接對象」做了一個記錄器現在讓我說logger.trace和log.warn如果我想過濾跟蹤(唯一)沒有顯示警告? – Stacker

+1

在配置文件中配置記錄器時,可以爲每個配置一個minLevel,maxLevel或離散級別。因此,對於記錄器「A」,您可以將其配置爲僅記錄跟蹤消息,對於記錄器「B」,您可以將其配置爲僅記錄警告消息(或警告或更低)。我會在我的答案中添加幾個示例。 – wageoghe

+0

用於「橫切」記錄器的+1 –

0

據我所知,不可能。 nlog的The log level class甚至沒有公共構造函數,只有預定義的靜態loglevel對象(即通常的Info,Trace等)。

但是有沒有一個單獨的目標不足的原因?