前回は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(木) ぱんまる


コメント