Anywhere you go, let me go too

關於部落格
對人海闊天空,做事仔細周密
  • 32290

    累積人氣

  • 16

    今日人氣

    0

    訂閱人氣

The Event Log of Windows 2012 trouble shooting

 首先是看下面這張圖的說明,在regedit的中,紅色框框的路徑,會記錄所有關於EventLog的定義


經MS的說明後我才了解,EventLogSource在所有EventLog中,必須是唯一的。也就是說在上圖中所有EventLog"孫"字輩的目錄不能有重覆的啦! (有點怪吧^^ 和我們對目錄的理解不同
,都已經是第三層目錄了,不是有第二層EventLogName區分了嗎?為什麼不同第二層項下不能有相同的EventLogSource???)
原因如下:去看[事件檢示器] 就能理解了,如下所示,每個EventLog Name會對應到一個
實體路徑,而這個實體路徑就是EventLogSource

而在.NET 提供了一個我們可以自訂EventLog的方式

我的問題是發生在我的LogName是抓程式的ServiceName欄位 ,目的是要可以產生不同程式名稱的程式,又要方便我可以判斷是那支程式在處理。

====================================
我碰到的問題是,我有10支一樣的程式,為了處理不同工作項目,所以我在CreateEventLog寫法如下:
EventLog.CreateEventSource("ServiceLog","ServiceLog")
EventLog.CreateEventSource("ServiceLog","ServiceLog1")
EventLog.CreateEventSource("ServiceLog","ServiceLog2")
....
所以當我在啟動服務的順序不是依上述方式啟動 ,就會出錯。舉例,我先啟動ServiceLog1時, 在
regedit中會建一個

 
EventLog 
    ServieLog1
        ServiceLog1 ===> MS自己會建這一個(相同名稱的)
        ServiceLog ===> 因為在我的程式中, 有告知我的Source是用ServiceLog

那麼這時就會發生服務起不來的情形,因為我的程式是指定
eventLog1.Log="ServiceLog"  ===> 但此時實際在事件檢視器看到的是EventLog1,所以依我的程式寫法,他找不到ServiceLog, 自然就起不來。

這時我如果改安裝第一支即正確對應的ServiceLog時,因為程式中有寫的去判斷

System.Diagnostics.EventLog.SourceExists("ServiceLog") ==> 在MS提供的method中, 只提供
.SourceExists(Source) 和 .SourceExists(SourceName, MachineName)這兩種參數可以填入,我想應該是因為微軟將所有EventLog Source都放在同一個目錄中,所以它的判斷有沒有會變成直接抓出regedit 第三層 來比對,所以只要這個EventLogSource被加入到任一個第二層目錄中, 這段
程式永遠不會被執行, 即以ServiceLog為"LoginName"永遠不會先建, 那麼所有的
Service永遠將因為找不到LogName可以寫入,所以服務都會啟不來
========================================

所以為了不產生以後發生類似情形, 微軟應該有兩種方式解決
方法1:
  將原先EventLog Source之實體目錄存放路徑與regedit設定一致; 但這種方式,連.NET程式開發的Method都要調整, 即上述的
SourceExists() 參數, 要多帶一個參數(EventLog Name),
但這個作法會變成,所有程式都要調

方法2: 
         以後新版的.NET Framework 和 開發工具程式寫法變成只要定義 EventLogName , 其餘
EventLog Source都由MS自行一對一自動產生。即不同EventLogName對應的EventLog Source一定不同。這個應該也會要調程式.

......
感覺好像方法2比較省時省力8-)



 

相簿設定
標籤設定
相簿狀態