2012-06-26 24 views
2

我寫了一個自定義Windows服務,它將數據寫入自定義事件日誌(在Windows事件查看器中)。我的自定義Windows服務未寫入我的自定義事件日誌中

對於開發服務使用的biz邏輯,我創建了一個Windows窗體,它模擬Windows服務的啓動/停止方法。

當通過Windows窗體執行biz邏輯時,info被成功寫入到我的自定義事件日誌中。但是,當我從自定義Windows服務運行相同的biz邏輯時,信息無法寫入事件日誌。

爲了清楚起見,我編寫了一個庫(.dll),用於完成我希望我的自定義服務執行的所有工作 - 包括創建/寫入自定義事件日誌。我的表單應用程序也像我的Windows服務一樣引用這個庫。

考慮到這個問題是一個安全問題,我手動將自定義Windows服務設置爲「登錄」爲「管理員」,但該服務仍未寫入事件日誌。

我被困在如何解決這個問題,因爲我無法調試並進入代碼時,我運行該服務(如果有一種方法來調試服務,請分享)。

對於可能導致服務無法寫入事件日誌的問題,您是否有任何想法?

回答

0

我發現我的服務沒有寫入事件日誌的原因。

該問題與試圖寫入EL的代碼/安全性/等的任何部分無關。問題在於我的服務沒有成功收集寫入EL的信息 - 因此,該服務甚至沒有嘗試寫入日誌。

現在我修復了收集數據的代碼,數據正在成功寫入事件日誌。

我很樂意接受這個問題,因爲這個問題對於真正的問題是不對的。

1

要調試正在運行的服務,您需要附加到進程。 See here for the steps.

您還可以將參數檢查添加到Main入口點,並有一個組合服務和控制檯應用程序,該應用程序將基於某個標誌啓動。見this SO post for a good example但這裏有一個片段:

using System; 
using System.ServiceProcess; 

namespace WindowsService1 
{ 
    static class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args == null) 
      { 
       Console.WriteLine("Starting service..."); 
       ServiceBase.Run(new ServiceBase[] { new Service1() }); 
      } 
      else 
      { 
       Console.WriteLine("Hi, not from service: " + args[0]); 
      } 
     } 
    } 
} 

以上開始在控制檯模式下,如果有任何參數存在,並且在服務模式下的應用程序,如果沒有參數。當然它可能更有趣,但這是交換機的要點。

+0

謝謝,保羅。很有幫助。通過調試,我能夠確定「可能」是事件日誌未被寫入的原因。 – Jed

1

我像這樣使用它。可能有一些錯別字。在我的手機瀏覽器上將其彈出...

public class MyClass 
{ 
    private EventLog eventLog = new EventLog(); 

    public void MyClass() 
    { 
     if (!System.Diagnostics.EventLog.SourceExists("MyLogSource")) 
      System.Diagnostics.EventLog.CreateEventSource("MyLogSource", "MyLogSource_Log"); 
     eventLog.Source = "MyLogSource"; 
     eventLog.Log = "MyLogSource_Log"; 
    } 

    private void MyLogWrite() 
    { 
     eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error); 
    } 

} 
相關問題