3 Stimmen

Entfernen Sie Log4net (null): Bedingte Ausgabe

Ich versuche, die Ausgabe "(null)" zu unterdrücken. Wenn ich dieses conversionPattern habe:

%property{MyProp}

...und wenn MyProp null ist, dann ist die Ausgabe:

(null)

In den meisten Fällen ist das gut. Aber was ist, wenn ich nicht möchte, dass "(null)" ausgegeben wird? Kann das gemacht werden?

Das Problem wird interessanter, wenn mein conversionPattern so aussieht:

MY_PROP=%property{MyProp}

In diesem Fall wird selbst wenn ich einen Weg finde, um das "(null)" zu unterdrücken, meine Ausgabe immer noch sein:

MY_PROP=

Am liebsten würde ich alles bezüglich "my prop" unterdrücken, wenn der Wert null ist. Wenn ich meine eigene Syntax erfinden würde, könnte es so aussehen:

%(MyProp,MY_PROP=%MyProp)

Dies würde log4net veranlassen, das conversionPattern, das im zweiten Parameter angegeben ist, zu unterdrücken, wenn der erste Parameter null war.

Abgesehen von meinen Überlegungen, gibt es einen echten Weg, dies in log4net zu tun?

1voto

cristiano2lopes Punkte 2668

Eine Möglichkeit, dies zu tun, besteht darin, einen benutzerdefinierten PatternLayoutConverter zu erstellen. Wenn der Eigenschaftswert null ist, schreiben Sie den customNullReplacement (der sogar auf dem Option-Schlüssel basieren kann, wenn Sie etwas Dynamik wünschen).

namespace LogUtils
{
    public class CustomNullProperty : PatternLayoutConverter
    {
        private static string customNullReplacement = "????";
        override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                var prop = loggingEvent.LookupProperty(Option);
                if(prop == null)
                {
                    prop = customNullReplacement;
                }
                WriteObject(writer, loggingEvent.Repository, prop);
            }
            else
            {
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }
        }
    }
}

Dann definieren Sie diesen Konverter - unter Verwendung des -Tags - in der Log4Net-Konfiguration (Beispiel für eine XML-basierte Konfiguration unten) und verwenden ihn in Ihrem conversionPattern:

Es gibt andere Ansätze wie das Erstellen eines Renderers für System.Object, aber ich finde diesen Ansatz expliziter.

Für Ihre zweite Anforderung könnten Sie mit dem benutzerdefinierten Konverter einfach das Präfix innerhalb des benutzerdefinierten converter-Writers verschieben.

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