【プログラミングしてみよう23】Javaのログ出力の基礎(java.util.logging)

Java

前回はOptionalを使ってnullを安全に扱う方法を学びました。

今回は「ログ出力」について解説します。 これまでデバッグや動作確認に System.out.println() を使ってきましたが、実際の開発現場ではログ出力の仕組みを使うのが一般的です。Javaに標準で組み込まれている java.util.logging を使って、ログの基本を学びましょう。

ログ出力の基本

System.out.println() はシンプルで便利ですが、以下のような問題があります。

  • どのクラス・どのメソッドで出力されたか追いにくい
  • 出力する・しないを切り替えるのが手間
  • ファイルへの保存や出力先の切り替えができない

ログ出力の仕組みを使うと、これらの問題を解決できます。java.util.logging はJavaに標準で組み込まれているため、追加のライブラリなしで使えます。

import java.util.logging.Logger;

Logger のインスタンスは、クラス名を渡して取得するのが一般的です。

Logger logger = Logger.getLogger(クラス名.class.getName());

ログレベルとは

ログには「重要度」を示すレベルがあります。java.util.logging では以下のレベルが用意されており、上に行くほど重要度が高くなります。

SEVERE  // 重大なエラー
WARNING // 警告
INFO    // 通常の情報
CONFIG  // 設定に関する情報
FINE    // デバッグ情報(詳細)
FINER   // デバッグ情報(より詳細)
FINEST  // デバッグ情報(最も詳細)

レベルを設定することで、指定したレベル以上のログだけを出力するよう制御できます。たとえば本番環境では WARNING 以上だけ出力し、開発中は FINE まで出力するといった切り替えが可能です。

サンプルコード(基本的なログ出力)

ファイル作成

「Java12」フォルダに LogTest.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

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

public class LogTest {
    private static final Logger logger = Logger.getLogger(LogTest.class.getName());

    public static void main(String[] args) {
        logger.info("アプリを起動しました");

        int[] numbers = {10, 20, 0, 30};

        for (int num : numbers) {
            if (num == 0) {
                logger.warning("0が含まれています。スキップします");
                continue;
            }
            int result = 100 / num;
            logger.info("100 / " + num + " = " + result);
        }

        logger.info("処理が完了しました");
        logger.severe("これは重大なエラーのサンプルです");
    }
}

コンパイル

javac LogTest.java

実行

java LogTest

実行結果は次のようになります(日時やクラス名は実行環境によって異なります)。

7月 02, 2026 10:00:00 午前 LogTest main
情報: アプリを起動しました
7月 02, 2026 10:00:00 午前 LogTest main
情報: 100 / 10 = 10
7月 02, 2026 10:00:00 午前 LogTest main
情報: 100 / 20 = 5
7月 02, 2026 10:00:00 午前 LogTest main
警告: 0が含まれています。スキップします
7月 02, 2026 10:00:00 午前 LogTest main
情報: 100 / 30 = 3
7月 02, 2026 10:00:00 午前 LogTest main
情報: 処理が完了しました
7月 02, 2026 10:00:00 午前 LogTest main
重大: これは重大なエラーのサンプルです

サンプルコード(ファイルへのログ出力)

ファイル作成

「Java12」フォルダに LogFileTest.java という名前でファイルを作成します

コード入力

以下のコードを入力します。

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class LogFileTest {
    private static final Logger logger = Logger.getLogger(LogFileTest.class.getName());

    public static void main(String[] args) {
        try {
            FileHandler fileHandler = new FileHandler("app.log");
            fileHandler.setFormatter(new SimpleFormatter());
            logger.addHandler(fileHandler);
            logger.setLevel(Level.ALL);

            logger.info("ファイルへのログ出力を開始しました");
            logger.warning("これは警告メッセージです");
            logger.severe("これは重大なエラーメッセージです");

            System.out.println("ログをapp.logに出力しました");
            fileHandler.close();
        } catch (IOException e) {
            System.out.println("エラー:ログファイルの作成に失敗しました");
        }
    }
}

コンパイル

javac LogFileTest.java

実行

java LogFileTest

実行結果は次のようになります。

ログをapp.logに出力しました

実行後、「Java12」フォルダに app.log というファイルが作成され、ログの内容が保存されます。

コードの解説

Logger.getLogger(LogTest.class.getName()) でLoggerを取得しています。クラス名を渡すことで、どのクラスから出力されたログなのかが自動的に記録されます。private static final としているのは、クラス全体で1つのLoggerを共有して使うためです。

logger.info("...")INFO レベルのログを、logger.warning("...")WARNING レベルのログを、logger.severe("...")SEVERE レベルのログを出力しています。System.out.println() との大きな違いは、出力時に日時・クラス名・メソッド名が自動的に付与される点です。これにより、問題が起きたときにいつ・どこで何が起きたかを追いやすくなります。

ファイル出力の例では、FileHandler を使ってログをファイルに書き込んでいます。SimpleFormatter を設定することで、コンソールと同じような読みやすい形式でファイルに保存されます。logger.addHandler(fileHandler) でHandlerを追加すると、コンソールとファイルの両方に同時に出力されるようになります。logger.setLevel(Level.ALL) はすべてのレベルのログを出力する設定です。

まとめ

java.util.logging を使うことで、System.out.println() では難しかった「ログレベルによる出力の制御」「日時・クラス名の自動付与」「ファイルへの出力」が実現できます。INFO で通常の動作記録を、WARNING で注意が必要な状況を、SEVERE で重大なエラーをそれぞれ記録するという使い分けを覚えておきましょう。実際の開発現場ではLogbackやLog4jといった外部ライブラリもよく使われますが、まずは標準ライブラリの java.util.logging でログ出力の基本的な考え方を身につけておくと、どのライブラリを使うときにも応用できます。

2026/07/02(木) ぱんまる

コメント

タイトルとURLをコピーしました