【问题标题】:How to write an NLog target using Signalr如何使用 Signalr 编写 NLog 目标
【发布时间】:2014-01-16 21:21:43
【问题描述】:

我正在尝试为 NLog 编写一个目标,以使用 SignalR 将消息发送到连接的客户端。

这就是我现在所拥有的。我想知道的是我是否应该像这样-或-以某种方式获取对集线器的引用(SignalrTargetHub)和调用一个 SendMessage 方法就可以了?

两者都有性能影响吗?

[Target("Signalr")]
public class SignalrTarget:TargetWithLayout
{

    public SignalR.IConnectionManager ConnectionManager { get; set; }

    public SignalrTarget()
    {
        ConnectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
    }

    protected override void Write(NLog.LogEventInfo logEvent)
    {

        dynamic clients = GetClients();

        var logEventObject = new
        {
            Message = this.Layout.Render(logEvent), 
            Level = logEvent.Level.Name,
            TimeStamp = logEvent.TimeStamp.ToString("yyyy-MM-dd HH:mm:ss.fff")
        };

        clients.onLoggedEvent(logEventObject);
    }

    private dynamic GetClients()
    {
        return ConnectionManager.GetClients<SignalrTargetHub>();
    }

}

【问题讨论】:

  • github.com/cbley/NLog.SignalR,但它只发送“渲染”字符串作为单个“消息”属性。
  • 我希望看到一个 NLog->SignalR 桥,它同时发送原始 Message 和呈现的消息(MessageRenderedFullMessage)。

标签: nlog signalr


【解决方案1】:

我最终得到了与开始时相同的基本结构。只需进行一些调整即可获得我需要的信息。

  • 添加了异常详细信息。
  • Html 对最终消息进行了编码。

[Target("Signalr")]  
public class SignalrTarget:TargetWithLayout  
{  
    protected override void Write(NLog.LogEventInfo logEvent)
    {
        var sb = new System.Text.StringBuilder();
        sb.Append(this.Layout.Render(logEvent));

        if (logEvent.Exception != null)
            sb.AppendLine().Append(logEvent.Exception.ToString());

        var message = HttpUtility.HtmlEncode(sb.ToString());

        var logEventObject = new
        {
            Message = message,
            Logger = logEvent.LoggerName,
            Level = logEvent.Level.Name,
            TimeStamp = logEvent.TimeStamp.ToString("HH:mm:ss.fff")
        };

        GetClients().onLoggedEvent(logEventObject);
    }

    private dynamic GetClients()
    {
        return AspNetHost.DependencyResolver.Resolve<IConnectionManager>().GetClients<SignalrTargetHub>();
    }
 }

在我的简单测试中,它运行良好。这是否会在压力下增加任何显着负载仍有待观察。

【讨论】:

  • 我只是在调查这个并找到了这篇文章。这对你有什么影响?您是否创建了一个客户端来接收这些消息?如果你在某处发布一个完整的例子,那就太棒了。听起来是个好主意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多