2012-02-27 21 views
4

SignalRを使用して接続されたクライアントにメッセージを送信するNLogのターゲットを書き込もうとしています。SignalRを使用してNLogターゲットを書き込む方法

これは私が今持っているものです。私が疑問に思っているのはです。私は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>(); 
    } 

} 
+0

https://github.com/cbley/NLog.SignalRですが、「レンダリング」文字列は単一の「メッセージ」プロパティとしてのみ送信されます。 – yzorg

+0

元の 'Message'とレンダリングされたメッセージ(' MessageRendered'または 'FullMessage')の両方を送るNLog-> SignalRブリッジを見たいと思います。 – yzorg

答えて

2

私は私が始めた、基本的な同じ基本構造になってしまいました。私が必要とした情報を得るためにちょっとした調整をしました。

  • 例外の詳細が追加されました。
  • 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>(); 
    } 
} 

。ストレス下で重大な負荷が加わる場合は、依然として見られる。

+1

私はちょうどこれを見て、このポストを見つけました。どのようにこれはあなたのために働いたのですか?これらのメッセージを受け取るクライアントを作成しましたか?あなたはどこかの完全な例を投稿すれば素晴らしいだろう。素晴らしいアイデアのように聞こえる! – Jay

関連する問題