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;

有更好的想法吗?

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

4

2 回答 2

3

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

于 2012-11-15T20:19:17.550 回答
2

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

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

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

于 2012-11-16T17:08:55.137 回答