如何使用Signalr编写NLog目标

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

这就是我现在拥有的.我想知道的是我应该像这样使用解析ConnectionManager – 或者 – 以某种方式获取对集线器的引用(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>();
    }

}

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

>添加了异常详情.
> 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>();
    }
 }

在我的简单测试中,它运行良好.如果在压力下增加任何重要负荷,仍有待观察.

点赞