我有這個問題,我需要爲我的一個項目解決。 我需要爲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 ...
嘗試CodeSite從http://www.raize.com/DevTools/CodeSite/Default.asp –
我的公司編寫了我們自己的日誌記錄服務。我們使用一個自由線程的COM對象來允許應用程序將日誌消息推送到服務中,然後根據需要將消息排隊並刷新到日誌文件。您也可以考慮使用Windows系統事件日誌而不是純文本文件。然後,您的應用程序可以通過ReportEvent()將消息發送到該日誌,並讓操作系統爲您處理實際的日誌文件。 –
我會編寫一個單獨的記錄器服務,然後使用Window WM_COPYDATA消息讓您的三個服務向它發送消息。特別是因爲該日誌服務可以使文件保持打開以便追加。不斷打開文件變得緩慢。對不起,我現在不是我可以訪問示例代碼的地方。 –