Это 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), это будет испускать сообщение в окно отладки.
Вы можете написать свой собственный целевой лог. См. Https://github.com/NLog/NLog/wiki/Extending-NLog – Amy
Thx Amy. Я подумал об этом, но контекст клиента WCF находится на сервере, поэтому он недоступен для пользовательской цели. Мне нужно получить полностью отформатированное сообщение, которое было написано только для любой цели, возвращенной в вызов журнала, или событие logger, которое сообщает мне, что такое сообщение, поэтому я могу собрать несколько и отправить клиенту или по электронной почте. – Dave
Вы можете легко получить отформатированное сообщение в своей пользовательской цели. 'Layout.Render (logEventInfo)' – Julian