2012-11-15 43 views
9

我有這個問題,我需要爲我的一個項目解決。 我需要爲3種不同的服務創建一個日誌文件(不要問爲什麼,我的老闆要求這樣)。每個服務可以有多個線程試圖將信息記錄到文件中,所以我的問題是,最好的方法是什麼?在多個服務(每個服務有多個線程)之間共享一個日誌文件,如何?

我應該使用全局互斥鎖嗎?類似這樣的:

procedure LogToFile(fn, str: string); 
var 
    F: TextFile; 
begin 
    logMutex.Acquire; 
    try 
{$I+} 
    try 
     AssignFile(F, fn); 
     if FileExists(fn) then 
     Append(F) 
     else 
     Rewrite(F); 
     Writeln(F, DateTimeToStr(Now) + ': ' + str); 
     CloseFile(F); 
    except 
    end; 
{$I-} 
    finally 
     logMutex.Release; 
    end; 
end; 

initialization 
    logMutex := SyncObjs.TMutex.Create(nil, False,'some_global_mutex'); 

finalization 
    logMutex.Free; 

有什麼更好的點子嗎?

編輯:我應該建一個服務,記錄服務,即等待需要從其他服務記錄,然後只有一個服務必須處理日誌文件中的消息?如果這是一個很好的解決方案,那麼服務之間進行通信的最佳方式是什麼?我可以使用Indy ...

+3

嘗試CodeSite從http://www.raize.com/DevTools/CodeSite/Default.asp –

+1

我的公司編寫了我們自己的日誌記錄服務。我們使用一個自由線程的COM對象來允許應用程序將日誌消息推送到服務中,然後根據需要將消息排隊並刷新到日誌文件。您也可以考慮使用Windows系統事件日誌而不是純文本文件。然後,您的應用程序可以通過ReportEvent()將消息發送到該日誌,並讓操作系統爲您處理實際的日誌文件。 –

+1

我會編寫一個單獨的記錄器服務,然後使用Window WM_COPYDATA消息讓您的三個服務向它發送消息。特別是因爲該日誌服務可以使文件保持打開以便追加。不斷打開文件變得緩慢。對不起,我現在不是我可以訪問示例代碼的地方。 –

回答

3

您使用命名互斥鎖的解決方案將工作,並且肯定是最簡單的方法。

2

在一個大型項目中,有大約50-80個應用程序在多個終端服務器上運行(這使得難以同步),我設法將所有日誌輸出收集到單箇中央文件中。

應用程序使用開放源代碼Log4D framework和Internet Direct(Indy)通過UDP將日誌輸出寫入應用程序服務器。應用程序服務器有一個運行的UDP服務器應用程序,它接收日誌消息並將它們寫入單個文件。

由於日誌消息包含元信息(記錄器名稱等),日誌記錄服務器仍然可以配置爲除主文件之外還爲每個應用程序編寫單獨的文件。例如,從客戶端發送的一些日誌消息包含數據庫性能數據,它們將被寫入單獨的日誌文件以使其準備好進行分析,而無需進一步的篩選步驟。

相關問題