2014-11-11 5 views
2

Как реализовать следующий метод?Как визуализировать шаблон и его аргументы вручную в Serilog?

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

Аргументов такие же, как те, приняты ILogger.Debug т.д.

Причина, почему я хочу, это потому, что я хочу сохранить шаблон/значение в промежуточном исключении, которое необходимо иметь один строковое сообщение также. Это в основном что-то вроде этого:

// 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) { 
     // ??? 
    } 
} 

ответ

3

Там в an example in the Akka.NET repo это делается, хотя только скалярные значения поддерживаются в аргументах.

Основная идея заключается в использовании 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); 

(Извините заранее за биты, которые могут не компилироваться здесь.)

+0

Я использовал фрагмент выше, но мне пришлось добавить вызов '.Distinct()' после '.OfType ()', чтобы дедуксировать маркеры, которые могут появляться более одного раза в шаблоне. – jpierson

 Смежные вопросы

  • Нет связанных вопросов^_^