エラーメールを送る Monolog の設定方法¶
Monolog は、アプリケーションでエラーが起きた際にメールを送信するように設定することができます。あまりにも多くのメールを受け取らないようにするために、コンフィギュレーションで少しネストされたハンドラが必要になります。次のようになりますが、最初は複雑に見えますがハンドラ1つずつを見ていけば、とても簡単です。
-
YAML
# app/config/config.yml monolog: handlers: mail: type: fingers_crossed action_level: critical handler: buffered buffered: type: buffer handler: swift swift: type: swift_mailer from_email: [email protected] to_email: [email protected] subject: An Error Occurred! level: debug
-
XML
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:monolog="http://symfony.com/schema/dic/monolog" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/monolog http://symfony.com/schema/dic/monolog/monolog-1.0.xsd"> <monolog:config> <monolog:handler name="mail" type="fingers_crossed" action-level="critical" handler="buffered" /> <monolog:handler name="buffered" type="buffer" handler="swift" /> <monolog:handler name="swift" from-email="[email protected]" to-email="[email protected]" subject="An Error Occurred!" level="debug" /> </monolog:config> </container>
mail ハンドラは fingers_crossed ハンドラで、これはつまり指定したアクションレベルに到達したときのみトリガーされます。上記の場合であれば、 critical の際に到達したとみなされます。そうなると critical より下のアクションレベルのメッセージも全てログをとるようになります。 critical レベルは HTTP のエラーステータスの 500 番台のときのみトリガーされます。 handler 設定は、出力が buffered ハンドラに渡されることを意味しています。
Tip
もし 400 番台と 500 番台のエラーレベルでメール送信をトリガーしたい際には、 action_level を critical ではなく error に設定してください。
buffered ハンドラは、リクエストの全てのメッセージを保持して、ネストされたハンドラにそのメッセージを渡すだけです。このハンドラを使用しなければ、それぞれのメッセージは別々にメール送信されてしまいます。このハンドラを使うことで swift ハンドラにメッセージが渡されます。 swift あは、実際にエラーメールの送信を担います。この設定は送信先のアドレス、送信者のアドレス、そして件名のみで、簡単です。
これらのハンドラは、他のハンドラと組み合わせることができますので、メールを送信するのと同時にサーバにもログを付けることができます。
-
YAML
# app/config/config.yml monolog: handlers: main: type: fingers_crossed action_level: critical handler: grouped grouped: type: group members: [streamed, buffered] streamed: type: stream path: %kernel.logs_dir%/%kernel.environment%.log level: debug buffered: type: buffer handler: swift swift: type: swift_mailer from_email: [email protected] to_email: [email protected] subject: An Error Occurred! level: debug
-
XML
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:monolog="http://symfony.com/schema/dic/monolog" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/monolog http://symfony.com/schema/dic/monolog/monolog-1.0.xsd"> <monolog:config> <monolog:handler name="main" type="fingers_crossed" action_level="critical" handler="grouped" /> <monolog:handler name="grouped" type="group" > <member type="stream"/> <member type="buffered"/> </monolog:handler> <monolog:handler name="stream" path="%kernel.logs_dir%/%kernel.environment%.log" level="debug" /> <monolog:handler name="buffered" type="buffer" handler="swift" /> <monolog:handler name="swift" from-email="[email protected]" to-email="[email protected]" subject="An Error Occurred!" level="debug" /> </monolog:config> </container>
この設定では group ハンドラを使って buffered ハンドラと stream ハンドラの2つのグループメンバーにメッセージを送っています。これでメッセージはログファイルに書かれますし、またメールも送信されるようになりました。