エラーメールを送る 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_levelcritical ではなく 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つのグループメンバーにメッセージを送っています。これでメッセージはログファイルに書かれますし、またメールも送信されるようになりました。

前のドキュメント

ロギングで Monolog を使用する方法

次のドキュメント

クラスのオートローディングの方法

ソース