65 Stimmen

Wie kann ich doppelte Protokollierung in log4net eliminieren?

Ich habe ein Programm, das viele log4net-Aufrufe an die "myprogram"-Logger macht. Es ruft auch anderen Code auf, der log4net-Aufrufe an andere Logger macht. Ich möchte alle Logs höher als INFO für "myprogram" erfassen und alle Logs höher als WARN für alles andere. Auf diese Weise erhalte ich die Arbeitsnachrichten, die spezifisch für die Aufgabe sind, an der ich arbeite, werde aber immer noch über potenziell schlechte Dinge benachrichtigt, die im unterstützenden Code passieren. Ich möchte, dass dies sowohl an die Konsole als auch an eine Protokolldatei gesendet wird.

Ich habe die folgende log4net-Konfiguration:

Dies macht für mich perfect Sinn: log >WARN für alles und >INFO für den spezifischen "myprogram" Logger.

Das Problem ist, dass ich INFO-Nachrichten sowohl auf der Konsole als auch in der Protokolldatei zweimal protokolliert bekomme. Dies tritt nur auf, wenn sowohl die als auch die Elemente ausgefüllt sind; wenn ich eines davon entferne, funktioniert das verbleibende wie erwartet.

Ich könnte verstehen, wenn ich doppelt geloggte WARN-Einträge erhalten würde (da myprogram sowohl "root" als auch "myprogram" entspricht), aber es geschieht bei INFO, obwohl ROOT (vermutlich) auf WARN eingestellt ist.

Mache ich hier etwas falsch, oder handelt es sich um einen log4net-Bug/Unklarheit?

83voto

Sie erhalten Duplikate, weil Sie ihm sagen, Nachrichten zweimal zu protokollieren. Ich würde hier nicht empfehlen, Additivität zu verwenden, da Sie möglicherweise einige Nebenwirkungen erleben, entfernen Sie einfach die unnötige Konfiguration:

Sie müssen den appender-ref im Logger "myprogram" nicht angeben, da er sie vom Root-Logger erben wird; wenn Sie sie erneut angeben, wird er doppelt protokollieren.

0 Stimmen

Das hat bei mir gut funktioniert, als ich auf dasselbe Problem gestoßen bin. Das vermeidet auch das Additivitätsproblem.

1 Stimmen

@Jeffrey bist du dir bewusst, welche Probleme bei der Verwendung von Additivität auftreten können? Ich habe bisher keine Informationen dazu gefunden, die von Google bekannt sind.

0 Stimmen

@Tinister das Additivitätsproblem besteht darin, dass additivity=false festgelegt werden muss (wie in der obigen Frage), da andernfalls Ihre Ausgabe dupliziert wird.

72voto

Eddie Punkte 52504

Versuchen Sie diese Änderung, indem Sie die Additivität auf false setzen.

2 Stimmen

Dies ist eine gute Möglichkeit, um sicherzustellen, dass alle Nachrichten, die in das 'myprogram'-Protokoll protokolliert werden, nicht zum Root-Logger hochschnappen.

0 Stimmen

Funktioniert für mich; Ich möchte, dass alle Protokolleinträge einer bestimmten Klasse an einen anderen Appender als die anderen Klassen gehen.

0 Stimmen

@jaminator: Das ist eine schwierige Frage, die ich nicht einfach in einem Kommentar beantworten kann, und ich bin mir nicht ganz sicher, was du fragst. Fragst du, warum man so etwas konfigurieren könnte?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X