【问题标题】:NLog callback possible?NLog回调可能吗?
【发布时间】:2016-02-22 16:32:26
【问题描述】:

我正在将自制的日志系统转换为 NLog,我想知道是否有办法将事件添加到 Logger 或支持一种机制,当我记录消息时,我可以通过最终格式化的消息和 LogLevel。我目前使用这样的东西将服务器消息发送回连接的客户端。

谢谢

【问题讨论】:

  • 您可以编写自己的日志目标。见github.com/NLog/NLog/wiki/Extending-NLog
  • 谢谢艾米。我考虑过这一点,但 WCF 客户端上下文位于服务器中,因此无法用于自定义记录器目标。我需要获取刚刚写入任何返回到 Log 调用的目标的完全格式化的消息,或者一个告诉我消息是什么的记录器事件,以便我可以收集几个并发送给客户端或通过电子邮件。
  • 您可以在自定义目标中轻松获取格式化消息。 Layout.Render(logEventInfo)
  • 谢谢朱利安。但是,由于没有与编写日志消息的服务器通信的上下文,我如何将格式化的消息返回给我的应用程序?我还积累了其中一些消息,以便能够发送包含任务所有日志记录的电子邮件,因此服务器需要写入日志的消息副本。
  • 如何在服务器之间进行通信是一个单独的问题,超出了原始问题的范围。如果你想要回调能力,你需要编写一个自定义的 NLog 目标。

标签: callback nlog


【解决方案1】:

这是我在 cmets 中谈论的 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 配置(将此代码复制到一个空项目并添加 NLog nuget 包),这将向您的调试窗口发出一条消息。

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多