我知道Chris Fulstow project log4net.signalr,如果您想要非生產日誌,因爲它記錄了所有請求中的所有消息,所以這是個不錯的主意。我想通過發起請求來區分日誌消息,然後sed回合適的瀏覽器。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(如登錄ID-someguid),但我不知道是否有一些更聰明。
BOUNTY 我決定開始對這個問題賞金,我會還詢問有關架構,爲了看看我的策略是有道理,還是沒有。 我的疑惑是,我在從服務器到客戶端的單一「方向」中使用集線器,並使用它來記錄不是來自集線器調用的活動,而是來自其他請求(可能在其他集線器上提出的請求)這是一個正確的方法,以瀏覽器可見的log4net appender爲目標?
我從來沒有解決過這樣的問題,唯一出現在我腦海的就是重寫URL,以便每個瀏覽器/標籤實例都通過url唯一標識,或者是url和cookie的組合 – Wasp
@Wasp問題的應用程序是SPA :)我編輯的問題,以提出一個額外的想法,看看它是否有意義 –
我猜對了:)但我仍然認爲你可以想出一些智能路由規則有一種在網址中生成的唯一ID並以某種方式處理。愚蠢的想法,用戶去http://www.foo.com,你第一次連接到http://www.foo.com/n2998fhn239重定向他,並將其保存在您的SPA – Wasp