PHPの稼働状況や不具合の発生などを記録するログファイルは、Webシステムの安定稼働に欠かせません。ではPHPのプログラムでログファイルを書き出す処理をどのように作ればいいのでしょうか。
Webシステムを安定して稼働させるにはログファイルとその解析が欠かせません。そしてWebシステムの開発用プログラム言語とも言えるPHPには、ログファイルを作る機能が標準で組み込まれています。
今回はそのようなPHP標準で利用できるログファイルを作る機能について紹介します。
目次
ログファイルとは何か
24時間稼働しているWebシステムの状況を人が監視し続けることは不可能です。しかし、もしPHPのプログラムで何かトラブルが発生したらその原因を調べなければなりません。
そのようなトラブルの調査で利用されるのがWebサーバーの動作状況を保存してあるログファイルです。
ログファイルの重要性は解るものの、どう作ればいいのか分らない、という方もいるでしょう。そこでまずはログファイルとは何かについて紹介します。
ログファイルの定義
ログファイルとは、OSやアプリケーションの動作状況などを一定形式のフォーマットで時系列にファイルに記録したものです。一般的には何かのイベントが発生したタイミングに、その発生時刻とイベントの概要などを1行でファイルに書き出したファイルを指します。
ログファイルは通常テキストファイルに書き出されるのでOS付属のエディタでも読めますが、行数が多く人が目で追える量ではありません。そのため、ログファイルを解説するツールを準備して、不具合の解析などに使われます。
また、Webシステムのような24時間稼働するシステムでは、長く運用されているとそのログファイルが巨大になるので、定期的に分割する仕組みもよく利用されます。
ログファイルのフォーマット
OSやアプリケーション毎にログファイルのフォーマットは違いますが、次の情報が含まれています。
- 発生日時
年月日と時刻を秒単位で出力します - レベルを表すキーワードや数字
後で分類できるように、発生したイベントの原因に応じたレベルを表すキーワードや数字などを出力します - 概要
エラーメッセージやイベントの概要などをテキストで出力します
ログファイルを出力する仕組みによっては、出力するレベルを表すキーワードや数字を選べるようになっており、本番環境なら障害発生時だけログを書き出す、またデバック環境なら全てのログを書き出すといった設定を選べます。
さらにフォーマットをカスタマイズして、より紹介なメッセージを出力する機能を持つ仕組みなどもあります。
PHPのエラーメッセージも扱える
LinuxのターミナルなどでPHPのプログラムを実行した際、もしエラーが発生すると標準出力にそのエラーメッセージが表示されます。
しかし、WebシステムでPHPのエラーが発生したとしても、利用者に見えるようにメッセージが表示されるとは限りません。
PHPのログ機能を利用すれば、処理が中断する原因となるエラーが発生しても、そのメッセージをログファイルに記録することが可能です。ぜひ、この機能を利用してください。
PHPでログファイルを書き出すには
プログラミング言語PHPは、動的なWebページを生成するツールを起源としており、Webサーバーとは別にログファイルを作成する機能を持っています。ただし、その機能を利用するためには、適切に設定しなければなりません。
次からPHPでイベントが発生した際、その情報を自動でログファイルに書き出すための設定について解説します。
display_errorsを有効に
PHPにはエラーメッセージの表示と非表示を切り替えられる機能があります。例えば本番のサーバーでは利用者にエラーメッセージを見せない設定とし、開発用のサーバーでは見せる設定にする、といった使い方が可能です。
このエラーメッセージの表示・非表示の設定は、php.iniファイルにデフォルトとして定義するか、プログラム内でのみ有効なini_set関数で設定します。
php.iniファイルにエラー表示設定した例
display_errors = ON
php.iniファイルのある場所は、OSやPHPのバージョンなどによって違います。例えばCentOSの標準で使えるPHPなら「/etc/php.ini」です。自分の使う環境で探してみてください。
php_set関数でエラー表示設定した例
1 |
ini_set('display_errors', 1); |
php.iniファイルの設定については、下記の記事も参照してください。
PHPの設定を変えるには?php.iniの探し方と編集方法を解説
ログの出力レベルを指定する
ログファイルにはエラーだけが記録される訳ではありません。エラーではないものの注意を促すワーニングや警告といった情報も出力されます。
ログを詳細に解析したいデバック環境では全ての情報を出力するのに対し、本番環境では最低限必要な情報のみを出力したい、といったことがあるでしょう。そのような場合、ログの出力レベルを指定することが可能です。
ログ出力レベル
- E_ALL サポートされている全てのエラーと警告
- E_ERROR 重大な実行時エラー
- E_WARNING 実行時の警告(致命的ではない)
- E_PARSE コンパイル時のパースエラー
- E_NOTICE 実行時の警告(エラーが起こりうる状況時)
- E_DEPRECATED 将来のバージョンでは動作しないコードについての警告
- E_STRICT 実行時の注意
php.iniファイルでレベルを指定する場合は、次の行を書き換えます。
php.iniファイルにエラー表示設定した例
(全てのエラーと警告からE_NOTICE, E_STRICT, E_DEPRECATEDの3つを除いて出力する)
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED[変更後]デバック用に全ての情報を出力する例
error_reporting = E_ALL
この設定はerror_reporting関数でも設定できます。
error_reporting関数で全ての情報を設定する例
1 |
error_reporting(E_ALL); |
php標準のログ以外の情報を出力するには
先ほどまでPHPの標準のログ機能を設定する方法を紹介しました。PHPには、標準で出力するように定義されたログ以外にも、独自に設定した情報をログとして出力するerror_log関数が使えます。
次からerror_log関数の使い方について紹介します。
error_log関数の文法
標準のエラー出力にメッセージを出力する場合、error_log関数を次のように使います。
error_log( エラーメッセージ, 0 );
第1引数に記述するのはログに記録されるエラーメッセージの文字列です。続く第2引数にはメッセージタイプを指定しますが、0を指定してください。これで第1引数に指定したエラーメッセージをログとして出力します。
errro_log関数の使用例
1 |
error_log('接続に失敗しました', 0 ); |
erro_log関数の他の使い方
error_log関数には、PHP標準のログに出力する以外にも便利な機能があります。具体的に第2引数にはメッセージタイプに1を指定すると、電子メールでシステム管理者宛てにメッセージを送信することが可能です。
また、第2引数にはメッセージタイプに2を指定することで、標準のログファイルとは別のファイルにメッセージを出力できます。
電子メールでメッセージを送信する例
1 2 |
$log_time = date('Y-m-d H:i:s'); error_log('[' . $log_time . '] ' . "重大エラー発生:調査をお願いします。", 1, "sysop@example.com"); |
別のファイルに書き出す例
1 2 |
$log_time = date('Y-m-d H:i:s'); error_log('[' . $log_time . '] ' . "E-1例外処理を実施しました", 3, "/home/www/debug/debug.log"); |
まとめ
24時間稼働するWebシステムで安定稼働を目指すならログファイルは欠かせません。何かトラブルがあったらログファイルをチェックし、その不具合を解析するのが基本です。PHPでエラーやワーニングが発生したら、ログファイルに書き出して解析できるようにしておきましょう。
今回紹介したPHPのログの設定は、システムの安定稼働に重要な設定です。ぜひ、マスターしてPHPの不具合を解析できるようになりましょう。