我有这个问题,我需要为我的一个项目解决。 我需要为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消息让您的三个服务向它发送消息。特别是因为该日志服务可以使文件保持打开以便追加。不断打开文件变得缓慢。对不起,我现在不是我可以访问示例代码的地方。 –