3.1 イベントレベル一覧

ログは、プログラムの実行中に発生するイベントを記録するプロセスです。プログラマーとしての義務はrecord everything important、奇妙なエラーや重大なエラーが発生した場合にproduction、これらのログ以外に何も残らないからです。

エラーに関するすべての情報と通話履歴に関するすべての情報があれば、エラーは何倍も早く解決されます。しかし、ここからは単純な結論が導き出されます。つまり、すべてのメソッドの呼び出し、すべてのパラメータの値など、一般的にすべてをログに記録することです。

これも選択肢ではありません。情報が多すぎるのは、少なすぎるのと同様に問題です。スマートなロギングが必要です。人間が人間のために作ったもの。ここで、ログに関する最初の事実にたどり着きます。ログ内のすべてのエントリは、作成時にもカテゴリに分類されます。

イベントレベル一覧

プログラマは、イベントをログに書き込むときに、この情報がどれほど重要であるかを自分で判断する必要があります。イベントの重大度レベルはメッセージの作成者によって選択されます。ログに記録された情報の重要度には 5 つのレベルがありますlog4j

  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL

以下でそれらについて詳しく説明します。

3.2 デバッグ

このレベルはDEBUG最も重要ではないと考えられます。このレベルの重要度でログに書き込まれる情報は、アプリケーションのデバッグ中にのみ必要となります。デバッグ中に必要な情報をログに記録するには、 メソッドが使用されますdebug()

例:

class Manager {
    private static final Logger logger = LoggerFactory.getLogger(Manager.class);

    public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

このメソッドはdebugメソッドの先頭にあり (メソッドにはまだ何も実行する時間がありません)、メソッドに渡された変数の値をログに書き込むことに注意してください。これは、このメソッドの最も一般的な使用例ですdebug()

3.3 情報と警告

次の 2 つのレベルは とINFOですWARNinfo()それには との 2 つの方法がありますwarn()

このレベルは、INFO単に「あれやこれやが起こる」という情報メッセージに使用されます。ログ内のエラーの解析を開始するときに、その背景を読み取ると非常に役立ちます。この方法はこれに最適ですinfo()

このレベルは、警告を書き込むために使用されます ( warningWARNという単語から)。通常、このレベルの重要性では、何か問題が発生したという情報が書き込まれますが、プログラムはこの状況で何をすべきかを知っています。

たとえば、ファイルをディスクに書き込む過程で、そのようなファイルがすでに存在していることが判明しました。ここで、プログラムは警告 (警告) をログに記録できますが、ユーザーにダイアログ ボックスを表示して、別のファイル名の選択を提案します。

例:

class FileManager {
    private static final Logger logger = LoggerFactory.getLogger(FileManager.class);

    public boolean saveFile(FileData file) {
        logger.info(“save the file ” + file.getName());
        boolean resultOK = SaveUtils.save(file);
        if (resultOK) return true;

        logger.warn(“file writing problem ” + file.getName());
        String filename = Dialog.selectFile();
        boolean result = SaveUtils.save(file, filename);
        return result;
    }

3.4 エラーと致命的

最後に、最も重要な 2 つのログ レベルは とERRORですFATAL。これらの場合には、同じ名前の特別なメソッド (error()および )もありますfatal()

また、エラーを通常のエラー致命的なエラーの2 つのカテゴリに分類することも決定しました。致命的なエラーは、ほとんどの場合、アプリケーションのクラッシュ (デスクトップ アプリケーションの場合) または Web サービスのクラッシュ (Web アプリケーションの場合) を引き起こします。

もう 1 つの良い例は Windows オペレーティング システムです。プログラムがクラッシュしたばかりの場合、オペレーティング システムの観点から見ると、これは ですError。そして、オペレーティング システム自体がダウンし、Windows の死のブルー スクリーンが表示された場合、これはすでに ですFatal error

Java アプリケーションでは、ほとんどの場合、イベントは発生した例外に関連付けられますErrorFatal例:

class Manager {
    private static final Logger logger = LoggerFactory.getLogger(Manager.class);

    public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

3.5 ログに記録する内容

もちろん、すべてを連続して記録する価値はありません。ほとんどの場合、これによりログの可読性が大幅に悪化し、結局のところ、ログは読み取られるために最初に書き込まれることになります。

また、さまざまな個人情報や財務情報をログに書き込むことはできません。これにより、厳密かつ簡単に罰金や訴訟に遭遇する可能性があります。遅かれ早かれ、そのようなログは横に漏れますが、その後は問題はありません。

では、何をログに記録する必要があるのでしょうか?

まず、アプリケーションの開始をログに記録する必要があります。アプリケーションが起動したら、その動作モードとさまざまな重要な設定をログに記録することをお勧めします。これにより、将来ログを読みやすくなります。

次に、アプリケーションが連携するすべてのサードパーティ サービス (メール システムや外部サービス) のステータスをログに記録する必要があります。少なくとも、それらが適切に動作することを確認するには、接続の瞬間を確保する必要があります。

第三に、すべての例外をログに記録する必要があります。それらが期待されている場合は、それらに関する情報をコンパクトに記述することができます。例外に関する完全な情報は、バグを検索する際の重要な情報の 50% ~ 80% を提供します。

アプリケーションのシャットダウンをログに記録する必要もあります。アプリケーションは正常に終了し、ログに数十のエラーをスローしない必要があります。多くの場合、この場所でタスクのスタック、スレッド プールの問題、一時ファイルの削除の問題が見つかります。

セキュリティとユーザー認証に関連するすべてを必ず記録してください。ユーザーが連続して 10 回ログインまたはパスワードのリセットを試行すると、この情報がログに反映されるはずです。

非同期タスクに関するできるだけ多くの情報をログに記録します。このようなスレッドでは例外が失われることがよくあります。非同期タスクの場合は、必ずその開始と終了を記録してください。正常に完了した場合は、問題が発生した場合と同じ方法でログに記録されます。

ほかに何か?時間指定タスクの起動、保存されたタスクの起動SQL-procedures、データの同期、分散トランザクションに関連するすべて。始めるにはそれで十分だと思います。将来的にはこのリストに追加されます。