nlog - 如何使用 Signalr 编写 NLog 目标

标签 nlog signalr

我正在尝试为 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>();
        }
     }
    

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

    关于nlog - 如何使用 Signalr 编写 NLog 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9472162/

    相关文章:

    c# - Timer Job 是这项工作的正确工具吗?

    javascript - 如何关闭 SignalR 中的客户端 JavaScript 'Hub' 连接?

    asp.net-core - kestrel 中自托管的信号器中的最大并发请求数

    nlog - 是否可以在 internalLogFile 中使用 ${shortdate}?

    .net - 使用 NLog 登录 EventLog 的正确方法

    asp.net - ASP.NET MVC 4 : NLog or NLog. Web 上的 NLog

    c# - NLog 环境变量配置文件

    c# - 动态设置文件名时,未使用 NLog 创建日志文件

    SignalR 和 500 错误

    wcf - 在集线器外获取 SignalR 用户 (Hub.Context)