9

私のプロジェクトの1つで解決する必要があるこの問題があります。3つの異なるサービスに対して1つのログファイルを作成する必要があります(理由は聞かないでください。上司がこのように要求しました)。各サービスは、ファイルに情報をログインしようとする複数のスレッドを持つことができるので、私の質問は、これを行うための最良の方法は何ですか?

グローバルミューテックスを使用する必要がありますか?このようなもの:

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;

より良いアイデアはありますか?

編集:他のサービスからログに記録する必要があるメッセージを待機し、1つのサービスだけがログファイルを処理する必要がある別のサービス、ロガーサービスを構築する必要がありますか?これが優れたソリューションである場合、サービス間で通信するための最良の方法は何ですか?私はインディを使うことができました...

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 に答える