2016-02-22 2 views
0

Я в процессе преобразования домашней системы регистрации в NLog и задаюсь вопросом, есть ли способ добавить событие в Logger или каким-либо другим способом поддерживать механизм, когда при регистрации сообщения я могу получить обратный вызов с окончательным форматированное сообщение и LogLevel. В настоящее время я использую что-то подобное, чтобы отправить серверные сообщения обратно подключенному клиенту.Возможна ли обратная связь NLog?

Thx

+0

Вы можете написать свой собственный целевой лог. См. Https://github.com/NLog/NLog/wiki/Extending-NLog – Amy

+0

Thx Amy. Я подумал об этом, но контекст клиента WCF находится на сервере, поэтому он недоступен для пользовательской цели. Мне нужно получить полностью отформатированное сообщение, которое было написано только для любой цели, возвращенной в вызов журнала, или событие logger, которое сообщает мне, что такое сообщение, поэтому я могу собрать несколько и отправить клиенту или по электронной почте. – Dave

+0

Вы можете легко получить отформатированное сообщение в своей пользовательской цели. 'Layout.Render (logEventInfo)' – Julian

ответ

1

Это MCVE того, что я говорил в комментариях. Создайте цель, которая принимает некоторые функции обратного вызова:

[Target("MyFirst")] 
public sealed class MyFirstTarget : TargetWithLayout 
{ 
    private readonly Action<string>[] _callbacks; 

    public MyFirstTarget(params Action<string>[] callbacks) 
    { 
     _callbacks = callbacks; 
    } 

    protected override void Write(LogEventInfo logEvent) 
    { 
     foreach (var callback in _callbacks) 
     { 
      callback(logEvent.FormattedMessage); 
     } 
    } 
} 

Настройте NLog для использования цели. Я делаю это программно, так как обратные вызовы передаются в конструкторе. Вы также можете настроить цель в NLog.config, но ваша цель должна быть синглом, чтобы вы могли зарегистрировать обратные вызовы в коде.

class Program 
{ 
    public static void Main() 
    { 
     LogManager.Configuration.AddTarget("MyFirst", new MyFirstTarget(s => Debug.WriteLine(s))); 

     var logger = LogManager.GetCurrentClassLogger(); 
     logger.Debug("test"); 
    } 
} 

При отсутствии другой конфигурации NLog (скопировать этот код в пустой проект и добавить NuGet пакет NLog), это будет испускать сообщение в окно отладки.

+0

Спасибо большое Эми! – Dave

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