2014-01-14 101 views
0

我使用NLOG一個具體的目標有兩個目標:僅記錄在運行時

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <targets async="true"> 
    <target name="logfile" xsi:type="File" fileName="my.log"/> 
    <target name="console" xsi:type="Console"/> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Trace" writeTo="logfile"/> 
    <logger name="*" minlevel="Info" writeTo="console"/> 
    </rules> 
</nlog> 

是否有可能登陸的消息只對「日誌文」的目標,而不必寫入「控制檯消息「目標呢?

EDIT

澄清:我想直接在運行時從相同的類,以不同記錄器的消息(W/O不必改變XML)。類似於:

class Program 
{ 
    static Logger _logger = LogManager.GetCurrentClassLogger(); 

    static void Main(string[] args) 
    { 
     // Note - _logger.InfoToTarget() does not really exist 
     _logger.InfoToTarget("logfile", "This is my very detailed message, possibly with object dumps"); 
     _logger.InfoToTarget("console", "Short message"); 
    } 
} 

我知道這會將我的代碼與NLlog.config文件結合在一起。

回答

0

有幾種方法可以做到這一點,正確的方法取決於你的情況。

請記住,您通常希望避免讓您的應用程序對日誌的內部工作知之甚多。如果可能的話,最好配置nlog來決定事件應該被記錄的地方。

是否存在不應記錄到控制檯的特定命名空間?這很容易配置。此外,您可以使用「When」過濾條件(https://github.com/nlog/nlog/wiki/When-filter)或條件(https://github.com/nlog/nlog/wiki/Conditions

最好還是有多個記錄器實例,因此您可以調用適合每種情況的記錄器(每個類的記錄器) (Why do loggers recommend using a logger per class?)。

-1

當然,但我假設你的意思是在發佈時不再希望登錄到控制檯。您可以通過刪除或註釋寫入控制檯目標的偵聽器來輕鬆完成此操作。現在它只會寫入日誌文件目標。

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <targets async="true"> 
     <target name="logfile" xsi:type="File" fileName="my.log"/> 
     <target name="console" xsi:type="Console"/> 
    </targets> 

    <rules> 
     <logger name="*" minlevel="Trace" writeTo="logfile"/> 
     <!--<logger name="*" minlevel="Info" writeTo="console"/>--> 
    </rules> 
</nlog> 

寫入控制檯的規則現在已停用,但日誌文件處於活動狀態。如果這是在發佈期間,您可能想要更改規則,以便不將日誌記錄的最低級別作爲跟蹤日誌記錄進行處理,因爲它會使IO應用程序過度放慢。我過去曾問過這個問題,看來最好的做法是通過XML配置文件來實現。 (Logging in Release Build of Application (C#))來完成你正在尋找的功能

+0

這不回答問題... – ilans

1

一種方法是命名記錄

_logger = LogManager.GetLogger("MyConsoleLogger") 
_logger.Info("This will log to the console..."); 
_logger = LogManager.GetLogger("MyFileLogger") 
_logger.Trace("This will log to a file..."); 

,而不是在規則中使用

LogManager.GetCurrentClassLogger().    

在您的配置文件,你可以再列表

<rules> 
<logger name="MyFileLogger" minlevel="Trace" writeTo="logfile"/> 
<logger name="MyConsoleLogger" minlevel="Info" writeTo="console"/> 
</rules> 

這是迄今爲止最不漂亮的解決方案噸,但它確實給你你正在尋找的功能。