Ihr PatternConverter Weg ist ein Schritt in die richtige Richtung, obwohl die Verwendung der statischen Eingabe- und Ausgabeeigenschaften dies ermöglicht alles etwas wackelig (thread-sicher).
Der Trick hier ist zu erkennen, dass der Nachrichtenparameter auf logger.Debug (...) ist Objekt und das Sie können übergeben, was auch immer Sie möchten.
Sie können eine benutzerdefinierte Nachrichtentyp
public class InputOutput
{
public string Input {get;set;}
public string Output {get;set;}
}
definieren und dann lassen Sie Ihre Konverter lesen entweder Eigentum
public class InputPatternConverter : PatternConverter
{
protected override void Convert(System.IO.TextWriter writer, object state)
{
var msg = ((LoggingEvent)state).MessageObject as InputOutput;
if (msg != null)
writer.Write(msg.Input);
}
}
public class OutputPatternConverter : PatternConverter
{
protected override void Convert(System.IO.TextWriter writer, object state)
{
var msg = ((LoggingEvent)state).MessageObject as InputOutput;
if (msg != null)
writer.Write(msg.Output);
}
}
die Protokollierung dann viel sauberer wird
logger.Debug(new InputOutput { Input = ..., Output = ...});
Ihre Konfiguration wäre das Gleiche.
Ein Tipp ist jedoch, die PatternLayout Unterklasse und die Konverter im Konstruktor dieser Klasse hinzuzufügen. Auf diese Weise können Sie auch Ihre Konfiguration verkleinern. Dies wird nicht verursachen Sie das% Nachrichtentoken verlieren, Ihre% Eingabe und% Ausgabetoken werden zusätzlich zu allen Token, die PatternLayout unterstützt. So könnte man eigentlich ein Muster wie dieses:
"%date %message %newline%newline %input %newline%newline %output
Hier ist eine schnelle Implementierung eines benutzerdefinierten Musterlayout:
public class InputOutputPatternLayout : PatternLayout
{
public InputOutputPatternLayout()
{
AddConverter("input", typeof(InputPatternConverter));
AddConverter("output", typeof(OutputPatternConverter));
}
}
Um die Verwendung weniger ausführlich, Sie könnten dies als eine Erweiterungsmethode für die ILogger-Schnittstelle unter Verwendung der beiden Parameter implementieren. Dann wäre die Verwendung so etwas wie: logger.Debug (Eingabe, Ausgabe); –
Eine Einschränkung besteht jedoch darin, dass Sie den Parameter "@message" verlieren, es sei denn, Sie fügen einen weiteren Musterkonverter (oder möglicherweise eine Unterklasse von PatterLayout?) Und eine andere Eigenschaft hinzu. Ich habe nicht getestet, ob das funktioniert, aber wäre es ratsam, die ToString() -Methode zu überschreiben, um die @Message zurückzugeben (nur um es generischer zu machen), anstatt einen separaten Musterkonverter zu haben? – ilitirit
Oh und nur eine Korrektur: "State als InputOutput" sollte etwas wie "((LoggingEvent) Zustand) .MessageObject als InputOutput" stattdessen sein. – ilitirit