在多个服务(每个服务具有多个线程)之间共享日志文件,如何



我有一个项目需要解决这个问题。我需要为 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;

有什么更好的主意吗?

编辑:我是否应该构建另一个服务,一个记录器服务,等待需要从其他服务记录的消息,然后只有一个服务必须处理日志文件?如果这是一个很好的解决方案,那么在服务之间进行通信的最佳方式是什么?我可以使用印地...

使用命名互斥锁的解决方案将起作用,并且肯定是最简单的方法。

在一个在多个终端服务器上运行大约 50-80 个应用程序的大型项目中(这使得难以同步),我设法将所有日志输出收集到单个中央文件中。

这些应用程序使用开源 Log4D 框架和 Internet Direct (Indy) 通过 UDP 将日志输出写入应用程序服务器。应用程序服务器正在运行一个 UDP 服务器应用程序,该应用程序接收日志消息并将其写入单个文件。

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

最新更新