PHPフレームワークを含めさまざまな場所で広く利用されています。ログはアプリケーションの開発時だけではなく、アプリケーションを安定運用していくために非常に重要な仕組みです。ログの取得にmonologを使用する場合に設定不備がないように設定方法を理解しておく必要があります。本文書ではmonologを単独で使用することでPHPにおけるログ設定の理解を深めていきます。単独でmonologの設定が理解できればフレームワークに組み込まれたmonologの設定も理解することができます。monologに事前に準備されているProcessormonologのインストールmonologはパッケージ管理ツールのcomposerを使ってインストールを行います。MAC環境であればcomposerのインストールは下記が参考になります。適当なディレクトリを作成し、composerを使用してmonologのインストールを行います。monolog/monologインストール完了後、composer.jsonを確認するとインストールしたmonologのバージョンを確認することができます。}}ログファイルへの書き出し(サンプルコード利用)インストールが完了したので、monologのGitHubにあるサンプルのコードを利用して動作確認を行ってみます。monologをインストールしたディレクトリの中にtest.phpという名前のファイルを作成し以下を記述します。‘vendor/autoload.php’を入れてください。__DIR__はカレントディレクトリを表します。log$log->warning('Foo');$log->error('Bar');test.phpを実行するとtest.phpが保存されているディレクトリ内にyour.logファイルが自動で作成されます。test.php中身を確認すると下記の2行のログが記述されています。上記で実行したサンプルコードの解説を行っていきます。Logger('name');newでLoggerクラスをインスタンス化していますが、インスタンス化する際に識別用の名前を引数に入れています。ここではnameにしていますが、任意の名前を入力することができます。monologではインスタンスを識別するための名前をチャネル名と呼び、作成するインスタンスをチャネルと呼びます。別名をつけることで複数のチャネルを作成し識別することができます。LoggerクラスはgetNameメソッドを持っており、インスタンス化時につけたチャネル名を後で取得することができます。Logger('channel-name');var_dump($log->getName());実行するとchannel-nameが取得できます。ハンドラーの設定サンプルではログファイルへのログファイルへの書き込みを行いました。monologはファイルへの書き込みだけではなくメールやSlackでログ内容を送信することもできます。そのためmonologではログファイルへの書き込みだけではなく、処理の仕方によって異なるプログラムが必要になります。各処理を行うプログラムをハンドラーと呼び、処理によって利用するハンドラーを分けています。ログファイルに書き出す場合はログファイル書き込み用のハンドラー、Slackに送信する場合は、Slack送信用のハンドラーが準備されています。単一のファイルにログを書き込むため時は、StreamHandlerハンドラーを利用します。pushHandlerメソッドに使用するハンドラーを入力するとチャネルにハンドラーが設定されます。Logger::WARNING));StreamHandlerでは2つの引数を取っていますが、最初の引数はログを書き込むファイルのパスを指定しています。次のLogger:WARNINGでは、WARINIG以上のログレベルの場合にログファイルへの書き込みを行う設定をしています。ログレベルについてこの後に説明を行っています。ここまでのコードでログをファイルに書き込むための設定は完了です。ログレベルについてログを書き込む前にログレベルの説明を行っておきます。ログに書き込むメッセージにはレベルを設定することができ、以下の8つのレベルがあることがvendor/monolog/monolog/src/Monolog/Logger.phpファイルからも確認することができます。'EMERGENCY',);上のDEBUGが最も重要度が低く下のEMERGENCYの重要度が最も高いログのレベルです。上から下にいくにつれ重要度が高くなっていきます。アプリケーションの開発時にはどのようなメッセージも取得したいのでDEBUGレベルの設定を行っても問題がありません。本番環境でDEBUGレベルやINFOレベルのログをSlackやメールで送信する設定にするとあまりのログの多さに重要なメッセージを見逃したり、一日中重要でないメッセージを受信し続けるということにもなります。そのため、レベルはメッセージの重要さを決めるだけではなく、ハンドラーによってどのレベル以上のものを書き込んだり送信したりするのかを決めることにも利用されます。下記のStreamHanderでLogger::WARNINGを設定することでWARNING以上のメッセージのみログへの書き込みが行われます。Logger::WARNINGログへの書き込み各ログのレベルに応じたメソッドが準備されているので、メソッドを選択することで書き込む際のログレベルを設定することができます。WARNINGレベルでFooを書き込み、ERRORレベルでBarの書き込みを行っています。$log->warning('Foo');$log->error('Bar');書き出しのログレベルがWARNINGに設定されているので、どちらのメッセージもログファイルに書き込まれます。Logger::WARNING下記のようにWARNINGレベルよりも低いログレベルで書き込むとログには書き込みが行われません。$log->info('Foo');$log->notice('Bar');ハンドラーの設定ここまでは単一のログファイルに書き込みを行うStreamHanderハンドラーのみ動作確認を行ってきました。その他のハンドラーについても動作確認を行っていきます。ログローテーションハンドラーStreamHandlerでは単一のログファイルにログのメッセージを追記していきます。RotatingFileHandlerハンドラーを利用します。サンプルコードにRotatingFileHandlerハンドラーを追加します。monologでは1つのログインスタンスに複数のハンドラーを持たせることができるため、pushHandlerでRotatingFileHandlerハンドラーを追加します。RotatingFileHandler(__DIR__.'/your.log'));$log->warning('Foo');$log->error('Bar');RotatingFileHandlerハンドラーの引数にファイルパスを追加すると自動で日付が付与されたファイルが作成されます。2つのハンドラーを設定しているので、実行するとyour.logとyour-2019-08-14.logが作成されログメッセージが書き込まれます。RotatingFileHandlerハンドラーは作成するファイル数を$maxfiles変数で設定することができます。デフォルトでは0に設定されているので、日付のログファイルが毎日作成し続けられます。第2引数に数字を入力すると$maxfilesを設定することができます。下記では5を設定しているので、日付のログファイルが設定した数を超えるとその数以上のログファイルは自動で削除されます。RotatingFileHandler(__DIR__.'/your.log',5));SwiftMailerを利用してログ送信monologには、メール送信用のハンドラーとしてNativeMailerHandlerとSwiftMailerHandlerハンドラーが準備されています。今回はSwiftMailerHandlerハンドラーを利用してメールでログ送信を行います。SwiftMailerを利用するためにはSMTPサーバの情報が必要になります。本文書ではメール送信、受信環境用にMailtrapを利用しています。Mailtrapの設定情報を各自の環境に合わせて変更を行う必要があります。MailTrapはダミーのSMTPサーバを設定することが行えるサービスで、開発時にテストメールの送受信に使用することができます。SwiftMailerを利用するためには、composerでSwiftMailerをインストールする必要があります。swiftmailer/swiftmailerインストールが完了するとcomposer.jsonファイルにSwiftMailerが追加されていることが確認できます。}}SwiftMailerHandlerの設定monologではSwitfMailer用のハンドラーが準備されているので、SwiftMailが使用できる環境では簡単に設定を行うことができます。サンプルコードにSwiftMailerHandlerハンドラーを追加します。SMTPサーバなどの設定が必要になります。$message));$log->warning('Foo');$log->error('Bar');各行の説明を行っていきます。下記の行では、SMTPサーバの設定を行っています。各環境に合わせて設定値を変更してください。smpt.mailtrap.ioがSMTPサーバで2525はSMTPサーバが利用するポートを指定してください。setUsernameとsetPasswordはSMTPサーバに接続するユーザとパスワードを指定してください。->setPassword('XXXXXXXXXXXXX');作成した$transportを使用してSwift_Mailerインスタンスを作成しています。Swift_Mailer($transport);Swift_Messageの引数にはメールのタイトルを指定し、setFromには送信元のメールアドレス、setToには送信先のメールアドレスを指定します。name']);setBodyメソッドでメールの内容を設定することはできますが、ログメッセージで上書きされるため設定を行っていません。SwiftMailerHanderの引数に$mailerと$meassageを入力し、pushHandlerメソッドに渡します。$message));実行するとsetToに設定されたメールアドレス宛にログメールが送信されます。mailtrapで受信したメールSwiftMailerHandlerではデフォルトのログレベルがErrorに設定されているので、Error以上にログのみメールで送信されます。第3引数には、ログレベルを設定するので、DEBUGレベルを設定するとすべてのレベルのログがメールで送信されます。Logger::DEBUG));ログフォーマットのカスタマイズログに書き込むメッセージのフォーマットを変更することができます。デフォルトでは下記のフォーマットが設定されています。%extra%\n実際に出力されるメッセージは下記になります。[]ログのメッセージは下記の項目から構成されているため、項目を並び替えたり、項目間の文字列を変更することでフォーマットを変えることができます。%datetime%:日付%channel%:チャネル名%level_name%:レベル%message%:メッセージ内容%context%:コンテキスト情報%extra%:追加情報contextとextraについては後程説明を行います。ログフォーマットの変更ログのフォーマットを下記のように変更します。%extra%\n";Monolog\Formatter\LineFormatterを利用してログフォーマットの設定を行います。Logger::WARNING);$stream->setFormatter($formatter);$log->pushHandler($stream);$log->warning('Foo');$log->error('Bar');実行すると変更したログフォーマットでメッセージが書き込まれます。H:i:sで設定が行われているため日付は下記のように表示されます。H:i:sに変更を行います。Logger::WARNING);$stream->setFormatter($formatter);変更後実行すると下記のようにメッセージが書き込まれます。[]ログのメッセージに情報追加monologではログメッセージ以外に追加の情報を追加することができます。情報を追加する方法は2つ準備されているので、それぞれの設定方法を確認していきます。Contextを利用した情報の追加ログメソッドの引数に配列を指定することでログメッセージに情報を追加することができます。追加した情報は、ログフォーマットのコンテキスト情報%context%に対応します。'Seldaek'));実行後、ログメッセージを確認すると追加した情報が書き込まれていることを確認できます。[]プロセッサーを利用した情報の追加Processor(プロセッサー)を利用して、ログメッセージに追加情報を付加することができます。引数に$record変数を取るコールバック関数を利用して$record変数に情報を追加して、$recordを戻します。$recordはログメッセージの1行に対応します。$recordに情報を追加することですべてのメッセージ行に情報を追加します。プロセッサーを使用する場合は、pushProcessorメソッドを使います。world!が追加されます。world!"}monologに事前に準備されているProcessormonologにはプロセッサーが事前にいくつか準備されています。メモリの使用量を確認したい場合は、MemoryUsageProcessorを利用することができます。MemoryUsageProcessor);$log->error('Bar');実行するとメモリ情報が各メッセージに追加されていることがわかります。MB"}複数のプロセッサーを設定することも可能です。WebProcessorを利用するとリクエストしたURLやアクセスしたきたIPアドレスの情報をログに書き込むことができます。WebProcessor);$log->error('Bar');複数のプロセッサーを設定することもできます。新たにWebProcessorを追加します。WebProcessorを使用して情報をログに残す場合は、ブラウザから作成したファイルにアクセスする必要があります。ブラウザからアクセスできるようにphpのビルトインサーバーを利用します。localhost:8080ブラウザ経由で作成したtest.phpにアクセスすると下記のメッセージが書き込まれます。monologに事前に準備されているProcessor。