Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Log Level Design and Rotation: Why Apps Use DEBUG/INFO/WARNING/ERROR

2026年08月24日に「Dev.to」が公開したITニュース「Log Level Design and Rotation: Why Apps Use DEBUG/INFO/WARNING/ERROR」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ログレベルは、プログラムの動作記録の重要度を示すフィルタで、DEBUGやINFOなどで詳細度を運用中に調整できる。ログローテーションは、ファイル肥大化を防ぎ、ディスク容量を管理する仕組みだ。これらを活用し、効率的な運用と問題調査を両立できる。

ITニュース解説

ソフトウェアが実行される際に、内部で何が起きているかを記録する仕組みが「ログ」である。ログは、問題が発生した際に原因を特定したり、アプリケーションの動作状況を把握したりするために非常に重要だ。しかし、全ての情報を無差別に記録し続けると、ログファイルはすぐに膨大になり、管理が困難になる。そこで登場するのが「ログレベル」と「ログローテーション」という考え方だ。

ログレベルとは、記録する情報の重要度や詳細度を示す区分けのことだ。これにより、必要に応じてログの出力内容をフィルタリングできる。Pythonの標準ログモジュールには、主に五つのレベルが定義されている。

まず、「DEBUG」レベルは、コードが具体的に何を実行したかという、非常に詳細な情報を示す。開発中にコードの動きを追跡したり、問題の原因を深く掘り下げて特定したりする際に利用される。

次に「INFO」レベルは、アプリケーションの通常の動作状況や処理の進捗を記録する。例えば、特定の処理が開始された、完了した、といった一般的な情報がこれに該当する。アプリケーションが順調に稼働していることを確認するための基本的な情報となる。

「WARNING」レベルは、予期せぬ事態が発生したが、アプリケーションの処理自体は継続できる場合に用いられる。例えば、メール送信設定が不完全で通知メールを送れないが、他の主要な処理(バックアップやアップデートなど)は問題なく進められる、といった状況だ。これは重大なエラーではないが、確認や修正が必要な可能性のある事象を示す。

「ERROR」レベルは、アプリケーションのある操作が実際に失敗した場合に記録される。例えば、データベースへの接続が確立できなかった、ファイルの書き込みに失敗した、といった、具体的な機能の実行が阻害された状況を示す。このレベルのログは、速やかな対応が求められることが多い。

最後に「CRITICAL」レベルは、アプリケーション自体が継続できないほどの致命的な障害が発生した場合に用いられる。システム全体の停止につながるような、最も深刻な問題を示すレベルだ。

これらのログレベルは、単なる分類タグではない。それぞれに数値が割り当てられており、これがログ出力の「閾値(しきいち)」として機能する。例えば、ログレベルを「INFO」に設定した場合、INFO(数値20)以上のレベル、つまりINFO、WARNING、ERROR、CRITICALのメッセージだけが記録され、DEBUG(数値10)のような低いレベルのメッセージは出力されない。この仕組みのおかげで、アプリケーションのコードを変更することなく、運用中にログの詳細度を調整できる。通常時はINFOレベル以上を監視し、何か問題が発生した際には一時的にDEBUGレベルまで閾値を下げて、より詳細な情報を取得するといった使い方が可能になるのだ。これにより、詳細なデバッグ情報をコード内に常に入れておきながら、通常時はログが肥大化しないようにできる。

実際のアプリケーションでは、このログレベルの概念がどのように使われているか。例えば、あるメンテナンスエージェントのアプリケーションでは、ログ出力が二つの異なる記録先(ハンドラ)に送られるように設定されている。一つはファイルにログを記録するハンドラで、もう一つはコンソール画面にログを出力するハンドラだ。これらのハンドラに、デフォルトのログレベルとしてINFOが設定されているため、通常運用時にはDEBUGレベルの非常に詳細なメッセージは出力されず、INFO以上の重要な情報のみが記録される。しかし、コードベースには多くのlogger.debug()呼び出しが含まれており、これらは問題発生時にログレベルをDEBUGに下げたときに初めて有用な情報として表示されるように設計されている。この方法により、開発者は常に詳細な診断情報をコードに組み込んでおきながら、通常のログを邪魔することなく、必要に応じてその情報を活用できる。

アプリケーションのログレベルの実際の分布を見てみると、通常はINFOレベルの呼び出しが最も多く、次にWARNING、ERRORと続くことが多い。これは、多くのアプリケーションが正常な処理の進捗を頻繁に記録する必要があるためだ。例えば、複数のサイトを連続して処理するアプリケーションでは、各サイトの処理ステップごとにINFOレベルの進捗記録が必要となる。WARNINGレベルは、メール送信設定の不備のように、メインの処理は続行できるものの、注意が必要な状況で使われる。ERRORレベルは、実際の操作が失敗した場合(データベースエラーやWP-CLIコマンドの失敗など)に限定して使われるため、その数は最も少なくなる傾向がある。CRITICALレベルが全く使われないアプリケーションも存在する。これは、アプリケーションの設計思想によるものだ。例えば、個々の処理が独立しており、一つのサイトの処理が失敗しても他のサイトの処理は継続できるような設計であれば、アプリケーション全体が停止するようなCRITICALな状況は想定されない。また、ユーザーへの緊急通知はログレベルとは別の仕組み(専用のアラートメール送信機能など)で行われるべきであり、ログはあくまでアプリケーション内部の記録として扱われるべき、という考え方もある。ログに何を書くか、そしてユーザーに何を伝えるべきかは、それぞれ異なる目的を持つため、これらを区別して設計することが重要だ。

長期間稼働するアプリケーションでは、ログファイルが際限なく肥大化し、最終的にはディスクの容量を使い果たしてしまうという問題が発生する。これを解決するのが「ログローテーション」という仕組みだ。RotatingFileHandlerは、この問題に対処するために設計された機能の一つである。このハンドラは、ログファイルのサイズが設定された上限に達すると、現在のログファイルを別の名前に変更し(例:maintenance.logがmaintenance.log.1になる)、新しく空のログファイルを作成してそこにログを書き込み始める。

この仕組みには二つの重要な設定がある。「maxBytes」はログファイルが回転を開始する最大のサイズを指定し、「backupCount」は保持する過去のログファイルの世代数を指定する。例えば、maxBytes=10MB、backupCount=5と設定した場合、現在のログファイルが10MBに達すると、それがmaintenance.log.1にリネームされ、maintenance.logという新しいファイルが作成される。次に現在のファイルが10MBに達すると、maintenance.log.1はmaintenance.log.2になり、maintenance.logがmaintenance.log.1になり、また新しいmaintenance.logが作成される。これを繰り返し、backupCountで指定された世代数を超える古いログファイルは自動的に削除される。この設定により、ログファイルが占めるディスク容量は「maxBytes × (1 + backupCount)」という計算で固定され、無制限に増大することなく、かつ一定量の履歴情報を常に保持できる。これは、長期間運用されるデスクトップアプリケーションなどにとって、ディスク容量の管理と問題発生時の調査に必要な情報保持を両立させる非常に効果的な方法だ。

さらに、アプリケーションでは複数のハンドラを使い分けることで、同じログメッセージを異なる目的で利用できる。前述のRotatingFileHandlerがアプリケーションの履歴を長期的に、かつ容量制限付きで保存することを目的としているのに対し、別のハンドラ、例えば_SiteLogCaptureのようなカスタムハンドラは、一時的に特定の処理(例:単一サイトのメンテナンス実行)のログ出力をメモリ上に収集するために利用される。この収集されたログは、その処理が完了した後にレポートや通知メールに組み込まれ、その後破棄される。このように、一つのログ出力ストリームに対して、異なる目的を持つ複数のハンドラを割り当てることで、長期保存用、リアルタイム監視用、一時的なレポート生成用など、様々なニーズに応じたログ処理を実現できる。ログレベルがログの詳細度を「垂直」にフィルタリングする役割を果たすのに対し、ハンドラの選択は、ログが最終的にどのような「目的」で、どの「読者」に届けられるかを「水平」にフィルタリングする役割を果たすと言える。

ログレベルは、単なる情報の重要度を分類するラベルではなく、後から詳細度を調整できる動的な「閾値」である。DEBUGは通常隠され、INFOは通常の進捗、WARNINGは回復可能な異常、ERRORは実際の失敗、CRITICALはアプリケーション自体が継続できないほどの致命的な失敗を示す。これらのレベルを適切に使い分けることで、ログの出力はアプリケーションの設計思想を正確に反映したものとなる。また、ログローテーションは、「無制限に記録し続ける」ことと「ディスク容量を使い果たさない」という相反する要件を、あらかじめファイルサイズと世代数を設定することで両立させる実用的な仕組みである。これらの技術は、ソフトウェアの安定した運用と問題解決に不可欠な要素なのだ。

関連コンテンツ

関連IT用語