Votre façon PatternConverter est un pas dans la bonne direction, bien que l'utilisation des propriétés d'entrée et de sortie statiques le rende tout un peu fragile (sécurité du filetage).
L'astuce ici est de réaliser que le paramètre message de logger.Debug (...) est objet et que vous pouvez passer ce que vous voulez.
Vous pouvez définir un type de message personnalisé
public class InputOutput
{
public string Input {get;set;}
public string Output {get;set;}
}
puis laisser vos convertisseurs lire soit la propriété
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);
}
}
l'exploitation forestière devient alors beaucoup plus propre
logger.Debug(new InputOutput { Input = ..., Output = ...});
votre config serait le même.
Un conseil est cependant de sous-classer PatternLayout et d'ajouter les convertisseurs dans le constructeur de cette classe. De cette façon, vous pouvez également réduire votre configuration. Cela provoquera la perte du jeton% message, vos jetons% input et% output viendront s'ajouter à tous les jetons que PatternLayout prend en charge. Ainsi, vous pouvez effectivement avoir un motif comme celui-ci:
"%date %message %newline%newline %input %newline%newline %output
Voici une mise en œuvre rapide d'une mise en page de motif personnalisé:
public class InputOutputPatternLayout : PatternLayout
{
public InputOutputPatternLayout()
{
AddConverter("input", typeof(InputPatternConverter));
AddConverter("output", typeof(OutputPatternConverter));
}
}
Pour la utilisation moins verbeuse, vous pouvez implémenter cela comme une méthode d'extension à l'interface ILogger en prenant les deux paramètres. Ensuite, l'utilisation serait quelque chose comme: logger.Debug (entrée, sortie); –
Une limitation cependant est que vous perdez le paramètre "@message", sauf si vous ajoutez un autre convertisseur de modèle (ou peut-être sous-classe PatterLayout?) Et une autre propriété. Je n'ai pas testé si cela fonctionne, mais serait-il conseillé de remplacer la méthode ToString() pour retourner le @ message (juste pour le rendre plus générique) au lieu d'avoir un convertisseur de modèle séparé? – ilitirit
Oh et juste une correction: "état comme InputOutput" devrait être quelque chose comme "((LoggingEvent) état) .MessageObject comme InputOutput" à la place. – ilitirit