Chris Fulstowプロジェクトlog4net.signalrを知っています。すべてのリクエストからのすべてのメッセージをログに記録するため、非本番ログが必要な場合は素晴らしいアイデアです。ログメッセージを発信し、適切なブラウザにsedバックするリクエストによってログメッセージを区別するものが欲しいのですが。
これが私がアペンダーでしたことです:
public class SignalRHubAppender:AppenderSkeleton
{
protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
if (HttpContext.Current != null)
{
var cookie = HttpContext.Current.Request.Cookies["log-id"];
if (null != cookie)
{
var formattedEvent = RenderLoggingEvent(loggingEvent);
var context = GlobalHost.ConnectionManager.GetHubContext<Log4NetHub>();
context.Clients[cookie.Value].onLog(new { Message = formattedEvent, Event = loggingEvent });
}
}
}
}
セッションIDをCookieに添付しようとしていますが、Cookieが上書きされるため、同じマシンでは機能しません。これは、イベントを添付するためにクライアントで使用するコードです。
//start hubs
$.connection.hub.start()
.done(function () {
console.log("hub subsystem running...");
console.log("hub connection id=" + $.connection.hub.id);
$.cookie("log-id", $.connection.hub.id);
log4netHub.listen();
});
その結果、接続されている最後のページだけにログメッセージが表示されます。現在のリクエストを発信するブラウザからの現在の接続IDを取得するための戦略があるかどうかを知りたいのですが、ある場合は。また、ブラウザごとのロギングを実現するためのより良い設計があるかどうかを知りたいと思います。
編集
慣例的な名前ベースのCookie(log-id-someguidなど)を作成することもできますが、もっとスマートなものがあるのではないかと思います。
バウンティ 私はその質問にバウンティを開始することに決めました。さらに、私の戦略が理にかなっているかどうかを確認するために、アーキテクチャについて質問します。私の疑問は、サーバーからクライアントへの単一の「方向」でハブを使用しており、ハブへの呼び出しからではなく、他の要求(他のハブで発生する可能性のある要求)から発生したアクティビティをログに記録するために使用しています。その正しいアプローチは、ブラウザに表示されるlog4netアペンダーを目標として持っていますか?