データベース操作のログを確認する方法|Spring BootでSQLログを出力してデバッグする基本
新人
「Spring Bootでデータベースを操作するとき、どんなSQLが実行されているのか確認したいんですが、方法はありますか?」
先輩
「いい質問だね。Spring BootではSQLログを出力することで、実際にどんなクエリが発行されているか確認できるよ。開発中のデバッグにも役立つし、パフォーマンスの改善にもつながるんだ。」
新人
「SQLログって、アプリを動かしたときに自動で出るんですか?それとも設定が必要なんですか?」
先輩
「Spring Bootの標準設定でもある程度は出力されるけど、細かく確認したいならapplication.propertiesで設定を追加する必要があるね。今回は、そのやり方を順に説明していこう。」
1. データベース操作のログとは何か
まず、Spring Bootの「データベース操作のログ」とは、アプリケーションがデータベースに送信したSQL文や、クエリ実行時の処理内容を記録するものです。たとえば、ユーザー登録や商品検索の処理を実行すると、裏側ではINSERTやSELECTなどのSQL文が発行されています。これらを確認できると、アプリが正しく動いているか、SQLが最適化されているかを調べやすくなります。
Spring Bootでは、内部的にHibernateやJPAといったフレームワークがSQLを生成しています。そのため、SQLを直接書かなくても動作しますが、実際にどんなSQLが発行されているかを知ることは非常に大切です。特に、エラー調査やパフォーマンスチューニングの際に役立ちます。
たとえば、次のようにユーザー情報を取得するコードを書いた場合、Spring Bootの内部では自動的にSELECT文が発行されます。
@Controller
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users")
public String getUsers(Model model) {
List<User> users = userRepository.findAll();
model.addAttribute("users", users);
return "user-list";
}
}
このとき、コンソールに何も表示されないと、どんなSQLが実行されたか分かりません。そうした場合にSQLログ出力を有効化することで、実行されたSQL文をリアルタイムで確認できます。これは、Spring Boot SQLログを活用した典型的なデバッグ方法です。
2. Spring BootでSQLログを出力する方法の概要
Spring BootでSQLログを確認する最も簡単な方法は、application.propertiesファイルに設定を追加することです。pleiades環境でGradleプロジェクトを作成した場合、この設定ファイルはsrc/main/resourcesディレクトリ内に自動で生成されています。
設定ファイルに次のようなプロパティを記述すると、SQLログの出力が有効になります。
# SQLをコンソールに表示する
spring.jpa.show-sql=true
# SQLを整形して見やすくする
spring.jpa.properties.hibernate.format_sql=true
この設定を有効にすると、Spring Bootアプリケーションを実行したときに、コンソール上にSQL文が出力されるようになります。たとえば、次のようなログが表示されます。
Hibernate:
select
user0_.id as id1_0_,
user0_.name as name2_0_,
user0_.email as email3_0_
from
users user0_
このように、SQL文が整形されて表示されるので、どのテーブルからどんなデータを取得しているのかがすぐに分かります。これは、Spring Bootのデータベース ログ 出力を理解するうえで欠かせない基本設定です。
また、より詳細なデバッグを行いたい場合は、logging.levelを使ってログレベルを変更できます。これは、Spring Bootのログ出力機能を拡張的に利用する設定で、SQLパラメータやトランザクションの情報まで表示できるようになります。
次のように設定を追加してみましょう。
# Hibernateが発行するSQLをDEBUGレベルで出力
logging.level.org.hibernate.SQL=DEBUG
# SQLのパラメータ値を表示
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
この設定を入れると、実際に発行されたSQLだけでなく、SQL内のパラメータ(バインド変数)も確認できます。たとえば、次のようなログが表示されます。
2025-10-25 14:10:45 DEBUG org.hibernate.SQL - select user0_.id, user0_.name, user0_.email from users user0_
2025-10-25 14:10:45 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - "taro@example.com"
これにより、SQLがどのように実行されているか、どんな値が渡されているかを確認できます。Spring BootでのSQL デバッグ 方法として最もよく使われる手法です。
初心者のうちは、このログを読むだけでもかなり勉強になります。実際にデータベースへのクエリがどう発行されているのかを目で追うことで、ORM(Object Relational Mapping)の動作やSQL最適化の仕組みを自然と理解できるようになるでしょう。
ここまでの設定で、Spring BootのSQLログ出力の基本は押さえられました。次のステップでは、より細かいログレベルの調整や、実際のアプリケーションでの活用例について学んでいくことができます。
3. application.propertiesでSQLログを設定する手順
Spring BootでSQLログを詳細に出力したい場合、中心となるのはapplication.propertiesファイルの設定です。このファイルは、Spring Bootアプリ全体の設定をまとめる重要な構成ファイルで、pleiadesで作成したGradleプロジェクトではsrc/main/resourcesフォルダに自動生成されています。
まず、基本的なSQL表示を行うために、次の設定を追加します。これはSpring BootのSQLログ 出力を有効化する最初のステップです。
# SQLをコンソールに出力する
spring.jpa.show-sql=true
# SQLを見やすく整形して表示する
spring.jpa.properties.hibernate.format_sql=true
上記を設定すると、実行されたSQL文がコンソールに表示されるようになります。ただし、このままではSQLの実行結果やパラメータの中身までは出力されません。より詳しく確認するためには、次のステップとしてHibernateのログ設定を追加します。
また、環境によってはSQLログが他のログに埋もれて見づらいことがあります。そのような場合は、ログの出力レベルやカテゴリを調整して、SQLだけを見やすくする工夫をしましょう。
特に、開発環境でのデバッグではDEBUGやTRACEを活用すると便利です。次の章では、具体的にどのように設定すればいいのかを紹介します。
4. HibernateやJPAのログレベルを変更してSQLを詳しく見る
Spring Bootは内部的にHibernateというORM(オブジェクトリレーショナルマッピング)ライブラリを使ってSQLを発行しています。そのため、Hibernateのログ設定を変更することで、より詳細なSQLログを確認できます。
設定はすべてapplication.propertiesで行います。以下のようにlogging.levelプロパティを使って、Hibernate関連のログ出力を調整します。
# Hibernateが発行するSQLをDEBUGレベルで出力
logging.level.org.hibernate.SQL=DEBUG
# SQLのパラメータ値(?部分)をTRACEレベルで表示
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
この設定を追加することで、実際に発行されたSQL文だけでなく、バインドパラメータの中身も確認できるようになります。これは、Spring BootのHibernate ログ 設定として最も一般的な方法です。
たとえば、次のようなログが出力されるようになります。
2025-10-25 14:18:32 DEBUG org.hibernate.SQL - select user0_.id, user0_.name, user0_.email from users user0_
2025-10-25 14:18:32 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - "taro@example.com"
このように、SQLの内容と実際に渡されたパラメータを同時に確認できるため、データベース操作のデバッグが格段にやりやすくなります。特に、複雑な検索条件やJOINを含むクエリでは、このログが開発者の大きな助けとなります。
なお、ログの出力先は基本的にコンソールですが、必要に応じてファイルに出力することも可能です。例えば、長期的なデバッグ記録を残したい場合などは、logging.file.nameを設定してファイル出力に切り替えることもできます。
# ログをファイルに出力する例
logging.file.name=logs/application.log
このようにして、コンソールに流れる大量のログの中から特定のSQLを追いかける手間を省くことができます。pleiades環境でも同様に機能し、実行時にlogsディレクトリ内に出力されるようになります。
5. 実行されたSQLとパラメータを確認する方法
ここまで設定を行えば、Spring Bootのアプリケーション実行時に、コンソール上でSQLログが確認できるようになっています。では、実際にどのような形式で出力されるのかをもう少し具体的に見てみましょう。
次のコードは、ユーザー情報を取得する@Controllerの例です。このコードを実行すると、設定したログレベルに応じてSQL文とパラメータが表示されます。
@Controller
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/user")
public String getUser(Model model) {
User user = userRepository.findByEmail("taro@example.com");
model.addAttribute("user", user);
return "user-detail";
}
}
このコードを実行すると、コンソールに以下のようなログが出力されます。
2025-10-25 14:20:10 DEBUG org.hibernate.SQL - select user0_.id, user0_.name, user0_.email from users user0_ where user0_.email=?
2025-10-25 14:20:10 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - "taro@example.com"
このログを読むと、実際に実行されたSQL文がselect user0_.id, user0_.name, user0_.email from usersという形式で出力されており、パラメータ部分も"taro@example.com"として確認できます。このように、application.properties SQL 表示設定を正しく行うことで、実際にどんなデータが渡されているかを追跡できるのです。
また、もしログが出力されない場合は、ログレベル設定が誤っているか、対象クラスのパッケージ名が異なっている可能性があります。Spring Bootではパッケージ単位でログレベルを設定できるため、必要に応じて対象を絞り込むこともできます。
# 特定のリポジトリクラスのみログを出したい場合
logging.level.com.example.repository=DEBUG
このように設定することで、他のログを抑えて特定のリポジトリやSQL出力のみを確認することができます。これは、アプリケーションの規模が大きくなったときに非常に役立ちます。
pleiadesで開発している場合、実行コンソールに色付きでログが出力されるため、SQL文とTRACEログを視覚的に区別しやすくなります。もし見づらい場合は、ログのフィルタ機能を使って「org.hibernate」を検索すれば、SQL関連のログだけを素早く確認できます。
これで、Spring BootでSQLログを出力してデバッグする準備は整いました。データベース操作の可視化を行うことで、バグの原因特定やパフォーマンス改善の手掛かりをつかむことができるでしょう。ログを読む力は、Springエンジニアとして成長するために欠かせないスキルのひとつです。
6. 実行ログからエラーや性能問題を見つけるコツ
SQLログを確認できるようになったら、次に大切なのはそのログをどう読み取るかです。Spring Bootのアプリを実行すると、コンソールに大量のログが出力されます。その中からエラーや性能問題を見つけ出すには、いくつかのポイントを意識するとよいでしょう。
まず、エラー発生時の例外スタックトレースを見逃さないことです。データベース接続エラーやSQL構文エラーがあると、ログに「org.hibernate.exception」や「SQLGrammarException」などのキーワードが表示されます。これらは、SQL文の書き方やテーブル名の指定ミスなどを示すサインです。ログ全体を確認して、例外の直前に実行されたSQL文を探すと、原因を突き止めやすくなります。
次に注目すべきはクエリの実行時間です。Spring Bootのデフォルトログには時間情報も含まれるため、同じSQLが何度も実行されていたり、特定のクエリが極端に時間を要している場合は、性能改善のヒントになります。たとえば、N+1問題が発生している場合、短時間に大量のSELECT文が出力されることがあり、これがボトルネックの原因になります。
また、SQLログを分析するときは、同じSQLが繰り返し出ていないかを確認すると良いでしょう。もし同じデータを何度も取得しているようであれば、キャッシュやフェッチ戦略の見直しが必要です。こうした観点でログを読むことで、Spring Bootアプリのパフォーマンス改善につながります。
ログを整理して見るためには、ファイル出力を有効にしてエディタで検索するのもおすすめです。pleiadesでは、application.logを開いて「DEBUG org.hibernate.SQL」で検索すれば、SQLログだけを抽出できます。これにより、データベース処理の全体像を時系列で把握しやすくなります。
7. SQLログを使ったデバッグの実践例(try-catchとの連携)
実際の開発現場では、SQLログと例外処理を組み合わせてデバッグすることが多くあります。Spring Bootでは、@Controller内でtry-catch構文を使うことで、エラーが発生した際にログ内容を参照しながら原因を調べることができます。
以下は、ユーザー情報を取得する際に例外が発生したとき、SQLログと組み合わせて原因を特定する例です。
@Controller
public class DebugController {
@Autowired
private UserRepository userRepository;
@GetMapping("/debug")
public String debugExample(Model model) {
try {
User user = userRepository.findByEmail("unknown@example.com");
model.addAttribute("user", user);
} catch (Exception e) {
System.err.println("エラー発生:" + e.getMessage());
}
return "debug-result";
}
}
このコードを実行すると、もしデータベース接続やSQL文に問題があれば、コンソールにエラーとともにSQLログが出力されます。
2025-10-25 14:31:08 DEBUG org.hibernate.SQL - select user0_.id, user0_.name, user0_.email from users user0_ where user0_.email=?
2025-10-25 14:31:08 TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - "unknown@example.com"
エラー発生:No entity found for query
このように、SQLログと例外メッセージを照らし合わせることで、どのSQLが原因でエラーが起きたかを即座に判断できます。特に、パラメータが正しく渡っているか、テーブル名やカラム名の指定に間違いがないかを確認する際に有効です。
また、try-catchで捕捉した例外をログに記録するのも良い方法です。Spring BootではLoggerFactoryを使ってログ出力を制御できるため、次のようにアプリケーションログに残しておくことができます。
private static final Logger logger = LoggerFactory.getLogger(DebugController.class);
try {
// SQL実行処理
} catch (Exception e) {
logger.error("データ取得中にエラーが発生しました", e);
}
このように設定しておくと、Spring BootのSQLログとアプリケーションの例外ログを統合的に確認できるようになります。特に、本番環境ではコンソールではなくファイルに記録しておくことで、後から問題解析を行う際に非常に役立ちます。
この手法は、Spring Bootのデバッグ 方法としても定番であり、SQLログ出力設定と例外処理を組み合わせることで、トラブルシューティングの精度を大幅に高められます。
8. 本番環境でのログ出力レベルとセキュリティ上の注意点
開発環境ではSQLログを詳細に出力することが非常に有用ですが、本番環境では注意が必要です。特に、ログに機密情報が含まれる可能性があるため、設定を誤るとセキュリティリスクにつながります。
本番では、TRACEやDEBUGレベルを避け、必要最低限の情報だけを出力するようにしましょう。たとえば、次のようにINFOレベルに設定することで、SQLログの出力を抑制できます。
# 本番環境ではSQLログを非表示にする
logging.level.org.hibernate.SQL=INFO
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=INFO
この設定により、詳細なSQLやパラメータ値は出力されず、システム全体のパフォーマンスやセキュリティが向上します。また、機密性の高いユーザー情報やパスワードなどを誤ってログに出さないよう、SQL文を出力する際にはTRACE設定を無効化するのが基本です。
さらに、ログファイルを長期間保存する場合には、アクセス権限を制限し、外部から閲覧できないように設定しておく必要があります。Spring Bootのlogging.file.name設定でログ保存先を指定した場合、そのディレクトリのパーミッションも確認しておきましょう。
たとえば、Linux環境では以下のようにコマンドでアクセス権を設定します。
chmod 600 logs/application.log
これにより、特定のユーザー以外がログファイルを閲覧できなくなります。ログの中には、実際に送信されたSQLやユーザー入力情報が含まれる場合があるため、セキュリティ管理は非常に重要です。
また、ログローテーションを設定して古いログを定期的に削除することで、ディスク容量の逼迫を防ぐこともできます。これは、長期稼働するSpring Bootアプリケーションでは欠かせない運用対策です。
このように、SQLログ確認やSQLログ出力設定を適切に使い分けることで、開発環境では詳細なデバッグを、本番環境では安全で効率的な監視を実現できます。pleiades+Gradle環境でも同様に設定できるため、学習の段階からログ出力の重要性を理解しておくことが大切です。