3

私は他の誰かのフレームワーク、netty、springをベースにしたゲームサーバーを開発しています。

そして、ゲームルームごとにlog4jを使用して個別のファイルを生成するのが良いアプローチかどうか疑問に思います。多くのゲームルームでは、サーバーは多くのログファイルを開いたままにする必要があるためです。一方、ログファイルが1つしかない場合は、問題を分析するときに解析とフィルタリングが必要になるため、完全に混乱します。

それを実装する方法を知る必要があるときに、多くのログファイルがまだ良いアプローチである場合。この質問を見て、実行時にカスタムファイルにログを記録するようにlog4jを構成しましたが、最初の答えは明確ではありません。別のログファイルに書き込もうとするたびに必要なコード行を最小限に抑える方法です。私は設定ファイルを入れて2番目の答えを試しました

log4j.appender.logfile.File=${logfile.name}

しかし、フレームワークには

PropertyConfigurator.configure(System.getProperty("log4j.configuration"));

開始時にログファイルが指定されていない場合は失敗します。

どんなアイデアやコメントでも大歓迎です!ありがとう

UPD:私の場合、このリンクも役立つようです。別々のファイルへのLog4jロギングしかしそれでも:最小限のコーディングで出力ログファイルを動的に切り替えるのは良い考えであり、どのように行うかです。

4

2 に答える 2

5

実際、ゲームルーム用に複数のログファイルを用意するのはやり過ぎでしょう。ファイルI/Oは、たとえそれが無視できるものであったとしても、パフォーマンスに影響を及ぼします。さらに、プログラマーとして、情報を解析およびフィルタリングするためのツールが非常に多くあるため、事後にこれを行う方がはるかに合理的であるように思われます。

たとえば、ロギング時に各ゲームルームが特定のパターンに一致する限り、grepとLinux>オペレーターを使用して、ゲームルームXのすべてのデータを解析し、個別に分析できる別のファイルに書き込むことができます。ログを表示している場合と表示していない場合でも、本番サーバーにこれを実行させることは、リソースの最適な使用法ではありません。

例として、このコマンドを実行すると、ゲームルームXについて必要なすべての情報をすばやく取得できます。

grep "game room x" mainLog.log > outputToAnalyze.log
于 2012-09-27T03:04:56.823 に答える
2

jmort253に同意しますが、部屋ごとにファイルが本当に必要な場合は、それぞれにアペンダーを作成します。

部屋が静的である場合は、log4j構成ファイルでアペンダーを定義するだけです。そうでない場合は、実行時に定義します。

それはまさにここから受け入れられた答えが言うことです:

  SimpleLayout layout = new SimpleLayout();    
  FileAppender appender = new FileAppender(layout,"<room_file_name>",false);    
  logger.addAppender(appender);

基本的に、構成ファイルは必要ありません。そこにあるコードが構成ファイルを置き換え、アペンダーをファイル名で動的に定義するため、次のことをお勧めします。

  1. ファイル名をパラメーターとして受け取る動的アペンダーを作成するメソッドを作成します(ロガーを返すか、ロガーを受け取ってアペンダーを追加します)。
  2. 部屋が作成されているところはどこでも、そのメソッドを呼び出します
  3. ロガーに新しいアペンダーを各部屋に割り当てて使用します
于 2012-09-27T21:01:02.400 に答える