3

デバッグレベルのログステートメントを作成するためのよりクリーンな方法はありますか?ある意味では、文字列リテラルは基本的にコードにコメントを付け、1行でログを提供しており、すでに非常にクリーンであると言えます。しかし、デバッグレベルのログステートメントを追加した後、コードを上下に読むのがはるかに簡単ではないことがわかりました。この例を見てください(自宅のPCに戻ったら、実際の例に更新する可能性があります):

int i = 0;
logger.debug("Setting i to 0,"); //Just an example, would show something more complex
i++;

InputStream is = socket.getInputStream();
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

IOUtils.write(request, dos);
logger.debug("request written to output");

while (!is.read(buffer))
    logger.debug("Reading into buffer");

logger.debug("Data read completely from socket");

CustomObject.doStuff(buffer);
logger.debug("Stuff has been done to buffer");
4

4 に答える 4

3

アスペクトを使用してみることができますが、これらには、メソッド呼び出しの「周囲」にのみログステートメントを配置できるという制限があります。つまり、特定のメソッドに入る前および/または離れた後です。

より詳細なログについては、手作業でコード化されたログメッセージ以外の方法はありません。

私は通常、コードが正常に機能することを確認したら、それほど必要とされていないデバッグログステートメントをコードから削除するように努めています(単体テストは必須です)。

于 2010-03-05T14:41:36.493 に答える
2

これを別のマシン/国/惑星で実行しているかどうかを自問してみてください。問題が発生し、ログファイルしかありません。何が問題になっているのかを知るために、どのような情報が必要ですか。

forループ、またはwhileループでは慎重にデバッグログを使用してください。たとえば、ファイルから1000レコードを読み取る場合、レコードごとに操作を実行します。forループの前に、「ファイルが存在し、読み取り可能で、1000レコードを読み取る予定です」と記録し、プロセスの完了後にステータスを出力することができます。たとえば1000000レコードの場合、100回または1000回の反復ごとに何かを印刷できます。

あなたのコードでは、iを0に設定するためのロガーを除いて、他のすべては私にとって意味があります。また、ロガー統計の文字列を計算するのが難しい場合は、log.isDebugEnabled()を使用するように注意してください。

元:

if(log.isDebugEnabled) {
   logger.debug("Here " + obj.aMethodCallThatTakes5MinsToEvaluateToString());
}

更新1:SLF4Jは問題の半分しか解決しません。

if(slfLog.isDebugEnabled) {
   slfLog.debug(obj.getObjectThatTakes5Mins());
}

はい、toStringは禁止されていますが、何らかの計算の結果である実際のオブジェクトをログに記録している場合は、禁止されていません。

于 2010-03-06T10:49:33.290 に答える
1

非常にきめ細かいデバッグ命令が必要な場合は、実際のコードをデバッグコードから分離できるかどうかわかりません。

より高いレベルでそれが必要な場合は、AOPを使用してログを追加すると、読みやすくなる可能性があります。プロキシオブジェクトを使用する可能性がありますか?

しかし、提供した例のようにきめ細かいデバッグ命令がある場合、私見では、ロガーを単体テストに置き換えることで、より多くを得ることができます。何かが起こったことをログに書き込まないでください。それが起こったことをテストしてください。

于 2010-03-05T14:40:57.717 に答える
0

ログステートメントが気に入らない場合は、多くのことを行うことができなくなります。情報はどういうわけかそこにある必要があります。

あなたができることは、そこに何が必要かを強く考えています。あなたは基本的にあなたのプログラムがどのように機能するかを定義ごとに知らないログファイルリーダーのために書いているので、情報は簡潔で正しい必要があります。個人的には、ログステートメントにメソッド名を頻繁に追加しています。

また、slf4jを使用すると、{}構文を使用できることに注意してください。

 log.debug("main() date={}, args={}", new java.util.Date(), args);

また、ユニットテストがあると、それが機能することがわかっているという理由だけで、そこに多くのものを移動できるようになります。

于 2010-03-06T11:01:03.403 に答える