2010-11-30 11 views
1

Ich habe den folgenden Code in meiner C# -Anwendung mit Nlog. Die Nachrichten mit 'Debug' werden protokolliert, aber 'Info' nicht. Da minLevel in app.config auf "Debug" gesetzt ist, wurde davon ausgegangen, dass auch die Info-Nachrichten protokolliert werden, da Debug eine höhere Priorität hat als "Info". Aber sie werden nicht eingeloggt. Wo bin ich falsch?Warum werden Nachrichten auf Info-Ebene nicht protokolliert, wenn die Mindeststufe Debugging ist?

Danke.

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 

Dies ist der app.config

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<targets> 
    <target name="file" xsi:type="File" fileName="E:/Logoutputs/Remissol-Nlog.txt" /> 
</targets> 

<rules> 
    <logger name="*" minlevel="Debug" writeTo="file" /> 
</rules> 

Antwort

3

Das ist nicht wirklich eine andere Antwort als @Nobby, weil er Recht hat, wie zu den Ebenen. Ich werde sagen, dass Sie die IfXXXXEnabled-Prüfung vor der Protokollierung nicht durchführen müssen.

Dies ist, was Sie in Ihrem C# -Code in Ihrer Frage für die Protokollierung Aufrufort haben:

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 

@Nobby schlägt vor, dies gemacht werden könnte sauberer durch dies zu tun:

if (logger.IsDebugEnabled) logger.Debug(logMessage); 
if (logger.IsInfoEnabled) logger.Info(logMessage); 

Ich glaube nicht, dass das wirklich stimmt. Mit Ihrem ursprünglichen Code wird NUR die Debug-Nachricht ODER die Info-Nachricht protokolliert. Wenn Sie die Verschachtelung entfernen, können Sie abhängig von der aktivierten Protokollierungsebene BEIDE Nachrichten protokollieren.

Ich glaube, Sie sollten diese Art und Weise werden Anmeldung:

logger.Debug(logMessage); 
logger.Info(logMessage); 

Die Logging-Methoden (logger.debug, logger.Info, etc.) bereits tun, um eine IsXXXEnabled Prüfung und wird nicht anmelden, wenn die Protokollierungsstufe nicht ist aktiviert. Sie können ein Protokoll der Eingabe (und der Verwirrung) speichern, indem Sie den Protokollierungsaufruf direkt durchführen, anstatt ihn mit der Prüfung if zu schützen.

Es gibt Zeiten, wenn Sie die IsXXXEnabled-Prüfung verwenden möchten. Wie wenn Sie einige Arbeit zu tun haben, den Wert (e) angemeldet sein, zu berechnen und Sie wollen nur, dass die Berechnung tun, wenn Sie sich anmelden:

if (logger.IsDebugEnabled) 
{ 
    int value1 = DoSomeExpensiveCalculation(); 
    int value2 = DoSomeOtherExpensiveCalculation(); 
    logger.DebugFormat("v1 = {0}, v2 = {1}", value1, value2); 
} 

diese Weise können Sie nicht den Preis der Berechnungen zahlen, es sei denn Sie werden sie tatsächlich protokollieren.

schließlich in NLog 2.0 haben Sie Zugriff auf Lambda-Syntax, die Sie würde es ermöglichen potenziell teure Operationen zu verschieben, wenn die Nachricht tatsächlich protokolliert:

logger.Debug(() => string.Format("v1 = {0}, v2 = {1}", DoSomeExpensiveCalculation(), DoSomeOtherExpensiveCalculation())); 

logger.Debug(() => "message" + i + ", " + j + "," + k); 

In beiden Fällen den Ausdruck, der NLog geben wird wird nur ausgewertet, wenn die DEBUG-Ebene aktiviert ist.

2

Ihr Problem liegt bei der verschachtelten if-Anweisungen in Ihrem Beispiel. Sowohl die Debug- als auch die Info-Protokollebenen sind gemäß Ihrer Konfigurationsdatei aktiviert. Die erste if-Anweisung wird dann ausgewertet und ihr Block ausgeführt, weil die Bedingung wahr ist. Der Else-Block wird daher nie erreicht und Ihre Info-Nachricht wird nie protokolliert.

Ich schlage vor, dass Sie Ihre verschachtelten if-Anweisungen in zwei separate Anweisungen aufteilen, wenn Sie die Nachricht für Debug-und Info-Ebenen protokollieren möchten.

Verwandte Themen