ロギングのルールとアドバイス?


13

私の組織では、ロギングに関するいくつかのルール/ギルドラインをまとめました。これについて、追加またはコメントできるかどうかを知りたいと思います。

私たちはJavaを使用していますが、一般的にlogginについてコメントすることができます-ルールとアドバイス

  1. 正しいログレベルを使用する

    • エラー:何かが非常に間違っているため、すぐに修正する必要があります
    • 警告:プロセスは修正せずに続行できます。アプリケーションはこのレベルを許容する必要がありますが、警告は常に調査する必要があります。
    • 情報:重要なプロセスが終了したという情報
    • デバッグ。開発時にのみ使用されます
  2. 何をログに記録しているかを確認してください。

  3. ロギングがアプリケーションの動作に影響を与えないようにします

ロギングの機能は、ログにメッセージを書き込むことです。

  1. ログメッセージは、説明的で、明確で、短く、簡潔でなければなりません。

トラブルシューティングの際にナンセンスなメッセージはあまり使用されません。

  1. log4jに適切なプロパティを配置する

適切なメソッドとクラスが自動的に記述されることを入れてください。

例:

Datedfile -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. ログ値。

アプリケーションから値を記録してください。

  1. ログプレフィックス。

アプリケーションのどの部分からロギングが書き込まれるかを、できればプロジェクトで合意された接頭辞などを使用して記述してください。 PANDORA_DB

  1. テキストの量。

ロギングテキストが多くなりすぎないように注意してください。アプリのパフォーマンスに影響を与える可能性があります。

  1. ロギング形式:

-log4jで使用するいくつかのバリアントとメソッドがありますが、例外をログに記録する場合は、次の形式を統一して使用したいと思います。

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

上記の例では、log4jプロパティを設定して、クラスとメソッドを自動的に書き込むと想定しています。

次のものではなく、常にロガーを使用します。

System.out.println(), System.err.println(), e.printStackTrace()

Webアプリケーションがフレームワークを使用する場合、ハンドラーでtry-catchを使用し、上記のモデルに従ってログを記録すると、EJBから非常に詳細なエラー情報を取得できます。

このプロジェクトでは、この変換パターンを使用して、メソッド名とクラス名を自動的に書き出します。ここでは、コンソールとdatedfileappenderに2つの異なるパテントを使用します。

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

上記の例の両方で、メソッドとクラスは書き出されます。コンソールには行番号も書き込まれます。

  1. toString()

toString()すべてのオブジェクトに対応してください。例:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

これらの出力を行う特別な方法の代わりに

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

ロギングを使用するこれらの方法で、追加、コメント、または疑問を感じることができるものはありますか?Javaに関連していない場合でも、お気軽に回答またはコメントしてください。Javaとlog4jは、これがどのように推論されるかの単なる実装です。



1
@gnat-あなたは正しいと思います。2つの質問には多くの重複があります。しかし、私はそれを複製と呼ぶのに苦労しています。

回答:


4

アプリケーション内のログステートメントがどこから来たかをログに記録するルールの拡張として、モジュールレベルのログ記録フラグを追加することができます。これにより、すべてを常に記録する代わりに、アプリケーションのセクションを選択的にターゲットにできます。これにはオーバーヘッドがあり、そのロギングを有効/無効にできる機能を作成する必要があります。理想的には、アプリケーションの実行中にオンザフライで有効/無効にすることができます。

デバッグの下に「トレース」という用語が表示されるのに慣れていますが、必ずしも普遍的な用語ではありません。「トレース」レベルのロギングは、モジュールのエントリ/出口、エントリ/出口のタイムスタンプ、渡された値をキャプチャするためのボーナスポイントなど、可能な限り追跡します。明らかに、それは大量のデータを生成し、それはあなたが意欲的にオンにするものではありません。ただし、プロセスにアタッチできない場合や、誤ったアプリケーションのコアダンプがない場合は、デバッグに関して利点があります。

私はログ情報とともにファイル/モジュール参照とタイムスタンプを見るのが好きです。アプリケーションの複数の領域のアクティビティを調整するだけでなく、スレッド間の競合状態を追い詰めようとするときに便利です。公平を期すために、これらの詳細がログファイルを混乱させると考える人々を知っています。タイムスタンプの追加は、チームと話し合うことです。(log4jが既にそれを行っている場合はおologiesびします。)

ロギングがそれ自体のスレッド/プロセスによって処理されていない場合は、同様に考慮する必要があります。ロギングが処理されるのをアプリケーションスレッドに待たせる代わりに、ログメッセージはログハンドラーに渡され、アプリケーションスレッドは快調に進みます。あるいは、ログメッセージを処理するための何らかのバッファメカニズムを作成することは、アプリケーションの応答性を高速化するもう1つの方法です。

ログファイルのサイズと履歴を制御することも考慮すべき機能です。アプリがホストシステムのすべてのディスク領域を使い果たしたくはありません。また、すべてのログファイルを永遠に保持する必要もありません。


2

心に留めておくべきことの1つは、ロギングのために何らかの種類の文字列操作を行う前に、ロギングレベルをチェックすることです。つまり、実際にログを記録しない場合は、日付フォーマッターのセットアップや、一連の文字列を連結してログメッセージを作成するすべての作業に進まないでください。これは、アプリケーションの速度を低下させる無駄な作業です。

参考までに、Apache Commonsプロジェクトには、メソッドの作成を簡素化するToStringBuilder クラスがありますtoString()


1

ここにニックが追加したものに疑問の余地はありません。これは私がしばらくしている方法です。あなたが提供した投稿は非常に詳細であり、おそらくロギングの一種のチュートリアルとして使用できます。ただし、ここに1つ追加したいことがあります。多くの場所で、条件付きログを使用するチャップを見てきました。

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

この種の条件付きトレースまたはデバッグは、最善の方法ではないと思います。


1

エラーを発生させたクラス/メソッドをログに記録することに加えて、そのメソッドに渡されたパラメーターもログに記録しておくと便利です。エラーが発生した場所を知ることは、1000回のうち1回しか発生しない場合にはあまり役に立ちません。また、エラーが発生した原因となったデータを知る必要もあります。

また、アプリケーションのデフォルトのロギングレベルを定義する変数があると便利です。そうすれば、WARNINGおよびERRORコードと一緒にDEBUGおよびINFOコードを持つことができます。プロダクションモードで実行する場合、デフォルトではDEBUG情報を出力しませんが、バグが発生した場合はフラグを更新し、ログへのDEBUGメッセージの書き込みを開始できます。


1

ロギングは、ほとんどの場合、横断的な関心事です。Javaだけでは、ロギングを実際のビジネスロジックから分離できるほど十分に表現力がありません。これは、たとえば、1つのメソッドを取得して別のプロジェクトに配置することはできませんが、実行する前にすべてのログを削除して調整する必要があることを意味します。そして、それは氷山の一角にすぎません。

ロギングと「実際の」ビジネスロジックを混在させるときの問題やその他の問題を防ぐには、アスペクト指向プログラミングの使用を検討する必要があります。Javaの場合、最も使用されるフレームワークはAspectJです。google tech talksからのこのYouTubeビデオには、AspectJと、ロギングを超えたその使用法が非常にうまく説明されています。もちろん、stackexchangeでも自分自身をログに記録するための多くの例があります。


0

特定のログファイルに関連付けられた複数のログコンテキストを持つ手段を持ち、コードがログコンテキストにその内容を破棄するよう明示的に要求しない限り、ログコンテキストに書き込まれたものがすべてログに記録されるようにすることをお勧めします。このような設計により、操作中にかなり詳細なログをキャプチャし、操作が成功した場合はそれらを破棄できますが、操作が失敗した場合は利用できます。そのようなログ機能がなく、何かが失敗したときに適切なログを使用できるようにするには、すべてが機能する99.99%の時間でアプリケーションが無駄なデータを記録するために多くの時間を浪費する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.