1.1 ログの概要

ログは発生したイベントのリストです。航海日誌や日記のようなものです。したがって、ロガーはログを記録できるオブジェクトです。プログラミングでは、ほとんどすべてのことをログに記録するのが通例です。Java では、すべてが同様であり、さらにはそれ以上です。

ロガーJava

実際、Java プログラムは、UI やコンソールなどを持たない大規模なサーバー アプリケーションであることが非常に多いです。数千のユーザーからのリクエストを同時に処理するため、さまざまなエラーが発生することがよくあります。特に、異なるスレッドが相互に干渉し始めた場合はそうです。

そして実際、そのような状況でまれに再現されるエラーや障害を見つける唯一の方法は、各スレッドで発生したすべてのことをログ/ファイルに書き込むことです。

ほとんどの場合、呼び出されたメソッドのパラメータ、インターセプトされたすべてのエラー、および多くの中間情報に関する情報がログに書き込まれます。ログが完全であればあるほど、一連のイベントを復元し、障害やエラーの原因を追跡することが容易になります。

しかし、ログが大きくなるほど、その処理は難しくなります。場合によっては、ログが 1 日あたり数ギガバイトに達することもあります。これで大丈夫です。

1.2 失敗したログ

最初のログとして、開発者は単純にコンソールへの出力を使用しました。これは、アプリケーションのデバッグ中、つまりすべての重要な情報と変数値がコンソールに書き込まれるときに行うと便利です。ただし、そのようなログは、アプリケーションの通常の動作中にはまったく適用できません。

第一に、アプリケーションはコンソール自体に何かを出力したいと考えますが、ユーザーはプログラマ向けのサービス情報をまったく見たくありません。

次に、コンソール バッファのサイズは制限されており、そこに多くのことを書き込むことはできません。

そして最後に、3 番目に、長期間にわたって収集されたプログラムのエラーに関する情報がプログラム開発者に送信される必要があります。これらすべての情報を一度にファイルに書き込むのが最も便利です。

開発者は最初の問題をすぐに解決し、別の出力ストリームを思いつきましたSystem.err。メッセージを書き込むと、標準コンソールではなく別のスレッドに送信されます。

ファイルへの書き込みの問題も解決されました。

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

しかし、この形式でも問題全体が解決されたわけではないため、ログ メッセージをファイルに書き込む特別なライブラリを作成することが決定されました。彼女はそれを賢明な方法で実行し、ログに記録されたイベントとデータのフィルターを柔軟に構成できるようにしました。

実際、ロギング プロセス全体は次の 3 つの部分で構成されます。

  • 最初の部分は情報収集です。
  • 2 番目の部分は、収集された情報のフィルタリングです。
  • 3 番目の部分は、選択された情報の記録です。

1.3 log4j ロガーの概要

Java コミュニティで最初に人気のあるロガーは、 でしたlog4j。これをプロジェクトに含めるのは非常に簡単です。pom.xml に数行を追加するだけです。

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

プログラムとそのようなロガーとのやり取りは次のようになります。

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 つのことが起こります。

オブジェクトの作成は緑色で強調表示されます Logger。そのオブジェクトは、その後の作業に便利なように静的変数に保存されます。また、getLogger()情報が収集されたクラスに関する情報もメソッドに渡されます。

青で強調表示された行は、デバッグ中にのみ値の情報をログに記録する場所です。このために、特別な方法が使用されます -debug()

最後に、発生した例外をログに保存する行が赤色で強調表示されます。例外は潜在的なエラーであるため、error().