我知道Chris Fulstow 项目 log4net.signalr,如果您想要一个非生产日志,这是一个好主意,因为它记录了来自所有请求的所有消息。我希望有一些东西可以通过发起它们的请求来区分日志消息并返回到正确的浏览器。
这是我在附加程序中所做的:
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 附加程序为目标?