2017-06-08 21 views
0

我試圖在Devforce Classic中實現自定義日誌發佈者。我想要做的是將寫入客戶端和服務器調試日誌的所有內容重定向到實現NLOG的日誌發佈者。該文檔指出,您可以實現自己的TraceSubscriber來連接自定義日誌發佈器。我無法獲取任何跟蹤消息來激發我的自定義發佈者的方法。有沒有可用的樣本可以讓我指出正確的方向?DevForce Classic實現自定義TraceSubscriber

回答

0

我發現了一個片段,顯示如何直接使用DF TraceSubscriber給用戶設置爲發佈消息的唯一樣本:

// Creates either WCF or Remoting instance based on IdeaBladeConfig. 
    // Overloads are available, or construct the concrete class directly. 
    var traceSubscriber = TraceSubscriber.CreateInstance(); 

    // The publish handler will be where you take the trace message and log to your own logs. 
    traceSubscriber.Publish += PublishHandler; 
    traceSubscriber.SubscriptionError += SubscriptionErrorHandler; 

    // This is overloaded 
    traceSubscriber.StartSubscription(url); 

    // You can issue this when done. 
    traceSubscriber.StopSubscription(); 

你將不能夠取代現有的TracePublisher機制,因爲它已經包含在DF中,但您可以通過類似於上面的代碼直接使用TraceSubscriber自定義訂閱方,通過繼承TraceSubscriber或實現ITraceSubscriber。訂戶將收到所有跟蹤消息,然後您的代碼可以確定如何處理它們。

如果你想嘗試定製ITraceSubscriber實施,請注意文檔(和實施)是一個有點古怪,以及連接到有線起來,你還必須獲得TracePublisher實例或代理,並調用它的訂閱方法:

// local (in-process) publisher: 
    var publisher = TracePublisher.LocalInstance; 
    publisher.Subscribe(this); 

    // for remote publisher: 
    var localURL = TracePublisher.CreateInstance().GetPublisherUrl(null); 
    // Use RemotingTracePublisher or WcfTracePublisher 
    var publisher = RemotingTracePublisher.GetRemoteInstance(localURL); 
    publisher.Subscribe(this); 

訂閱後,出版商將調用ITraceSubscriber.OnPublish方法:

public void OnPublish(TraceMessage traceMessage) 
{ 
    // do something with trace message 
} 
+1

感謝金!我可以通過創建一個新的TraceSubscriber的實例並訂閱該URL(上面的建議#1)來獲得此工作。關於關閉默認xml跟蹤發佈器使用的默認xml輸出,我只是簡單地將日誌文件設置爲空值。我意識到它不會在技術上關閉它,但它確實會壓制寫入xml文件,這正是我所要做的。 – Tim

+0

xml輸出是由一個叫做TraceFileXmlLogger的東西創建的,它使用TraceSubscriber。當您將日誌文件設置爲空字符串時,TraceFileXmlLogger永遠不會創建,所以您確實將其關閉。但是,無論訂閱者是否有訂閱者,TracePublisher都會一直髮布。 –