2012-11-15 41 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服务器应用程序,它接收日志消息并将它们写入单个文件。

由于日志消息包含元信息(记录器名称等),日志记录服务器仍然可以配置为除主文件之外还为每个应用程序编写单独的文件。例如,从客户端发送的一些日志消息包含数据库性能数据,它们将被写入单独的日志文件以使其准备好进行分析,而无需进一步的筛选步骤。

相关问题