Java:
ロギング

どのように:

Javaでのログ取りを始める簡単な方法は、ビルトインのjava.util.loggingパッケージを使用することです。

import java.util.logging.Logger;
import java.util.logging.Level;

public class AppLogging {
    private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    public static void main(String[] args) {
        LOGGER.info("INFOレベルのメッセージをログに記録");

        try {
            int division = 10 / 0;
        } catch (ArithmeticException e) {
            LOGGER.log(Level.SEVERE, "例外が発生", e);
        }
    }
}

これにより、以下のような出力が生成されます:

2023年7月3日 午後2時00分00秒 AppLogging main
情報: INFOレベルのメッセージをログに記録
2023年7月3日 午後2時00分00秒 AppLogging main
重大: 例外が発生
java.lang.ArithmeticException: / by zero
    at AppLogging.main(AppLogging.java:10)

深掘り

Javaにおけるログ取りはかなり進化しています。かつてのログはよりアドホックで、システム出力や自作のメカニズムで行われていました。しかしながら、標準化の必要性からログAPI、例えばLog4jSLF4Jなどが生まれました。java.util.loggingパッケージ自体はJDK 1.4で導入され、メッセージをログに記録するための標準化された方法を提供しています。

java.util.logging(JUL)の代替となるものにはLog4j 2やSLF4Jがあります。JULはJavaにビルトインされているため追加の依存関係は必要ありませんが、Log4j 2やSLF4Jは、ログ設定のより細かな制御、非同期ログ取り、より良いパフォーマンスなど、より進んだ機能を提供しています。

実装の面では、ログは同期的、つまり各ログメッセージがそれを生成したスレッドで処理されるか、非同期的、つまりメッセージが別のスレッドに渡されるかのどちらかになります。非同期ログ取りはパフォーマンスを向上させることができますが、同時にアプリケーションがクラッシュした際にログメッセージが失われないように並行処理を扱い、複雑さが増します。

参照