2

次のメソッドを実装するにはどうすればよいですか?

string BuildSerilogMessage(string messageTemplate, params object[] propertyValues);

ILogger.Debug引数は、 etcによって受け入れられたものと同じです。

これが必要な理由は、単一の文字列メッセージも必要な中間例外でテンプレート/値を保持したいからです。基本的には次のようなものです。

// this exception is designed to be easily loggable by serilog
[Serializable]
public class StructuredException : Exception {
    public string MessageTemplate { get; private set; }
    public object[] PropertyValues { get; private set; }

    public StructuredException(string messageTemplate, params object[] propertyValues)
        : base(BuildMessage(messageTemplate, propertyValues))
    {
        MessageTemplate = messageTemplate;
        PropertyValues = propertyValues;
    }

    public StructuredException(Exception inner, string messageTemplate, params object[] propertyValues)
        : base(BuildMessage(messageTemplate, propertyValues), inner)
    {
        MessageTemplate = messageTemplate;
        PropertyValues = propertyValues;
    }

    private static string BuildMessage(string messageTemplate, object[] propertyValues) {
        // ???
    }
}
4

1 に答える 1

4

引数でサポートされているのはスカラー値のみですが、これが行われている例がAkka.NET リポジトリにあります。

基本的な概念はMessageTemplateParser、テンプレートを取得するために使用することです:

var parser = new MessageTemplateParser();
var template = parser.Parse(messageTemplate);

次に、引数を使用してテンプレートからトークンを圧縮します。

var properties = template.Tokens
    .OfType<PropertyToken>()
    .Zip(propertyValues, Tuple.Create)
    .ToDictionary(
        p => p.Item1.PropertyName,
        p => new ScalarValue(p.Item2));

最後にレンダリング:

var rendered = template.Render(properties);

(ここでコンパイルされない可能性があるビットについては、あらかじめお詫びします。)

于 2014-11-13T08:46:45.500 に答える