Monolog 可以當(dāng)應(yīng)用程序出現(xiàn)錯(cuò)誤的時(shí)候被配置來發(fā)送電子郵件。這個(gè)配置需要一些嵌入的 handlers 來避免接收太多的電子郵件。這個(gè)配置起初看起來會(huì)很復(fù)雜但是每一個(gè) handler 在出故障時(shí)都是很直接的。
YAML:
# app/config/config_prod.yml
monolog:
handlers:
mail:
type: fingers_crossed
# 500 errors are logged at the critical level
action_level: critical
# to also log 400 level errors (but not 404's):
# action_level: error
# excluded_404s:
# - ^/
handler: buffered
buffered:
type: buffer
handler: swift
swift:
type: swift_mailer
from_email: error@example.com
to_email: error@example.com
# or list of recipients
# to_email: [dev1@example.com, dev2@example.com, ...]
subject: An Error Occurred!
level: debug
XML:
<!-- app/config/config_prod.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"
<!--
To also log 400 level errors (but not 404's):
action-level="error"
And add this child inside this monolog:handler
<monolog:excluded-404>^/</monolog:excluded-404>
-->
/>
<monolog:handler
name="buffered"
type="buffer"
handler="swift"
/>
<monolog:handler
name="swift"
type="swift_mailer"
from-email="error@example.com"
subject="An Error Occurred!"
level="debug">
<monolog:to-email>error@example.com</monolog:to-email>
<!-- or multiple to-email elements -->
<!--
<monolog:to-email>dev1@example.com</monolog:to-email>
<monolog:to-email>dev2@example.com</monolog:to-email>
...
-->
</monolog:handler>
</monolog:config>
</container>
PHP:
// app/config/config_prod.php
$container->loadFromExtension('monolog', array(
'handlers' => array(
'mail' => array(
'type' => 'fingers_crossed',
'action_level' => 'critical',
// to also log 400 level errors (but not 404's):
// 'action_level' => 'error',
// 'excluded_404s' => array(
// '^/',
// ),
'handler' => 'buffered',
),
'buffered' => array(
'type' => 'buffer',
'handler' => 'swift',
),
'swift' => array(
'type' => 'swift_mailer',
'from_email' => 'error@example.com',
'to_email' => 'error@example.com',
// or a list of recipients
// 'to_email' => array('dev1@example.com', 'dev2@example.com', ...),
'subject' => 'An Error Occurred!',
'level' => 'debug',
),
),
));
郵件 handler 是一個(gè) fingers_crossed 的 handler,這就意味著這只有在行為層才會(huì)被觸發(fā),在這個(gè)例子中到達(dá)了臨界。臨界層只會(huì)觸發(fā) 5xx HTTP 代碼錯(cuò)誤。如果一旦到達(dá)這一層 fingers_crossed 的 handler 將會(huì)記錄所有的消息且不管它們是哪一層。handler 設(shè)置意味著輸出之后傳遞到 緩沖 handler。
如果你想要 400 和 500 層次錯(cuò)誤觸發(fā)電子郵件,將 action_level 設(shè)置成 critical 而不是 error??梢詤⒄丈厦胬拥拇a。
緩沖 handler 簡(jiǎn)單地保留著請(qǐng)求的所有信息然后一口氣將他們傳遞到嵌入的 handler 中。如果不使用這個(gè) handler 那么每條消息將會(huì)分別發(fā)送電子郵件。這就是后來傳遞到 swift handler 的。這是專門處理向你發(fā)送錯(cuò)誤電子郵件的 handler。這個(gè)的設(shè)置很直接,對(duì)于來去的地址和主題來說。
你可以將這些 handler 與其他的合并這樣錯(cuò)誤就會(huì)在發(fā)出郵件的同時(shí)記錄在服務(wù)器中:
YAML:
# app/config/config_prod.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: error@example.com
to_email: error@example.com
subject: An Error Occurred!
level: debug
XML:
<!-- app/config/config_prod.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="error@example.com"
to-email="error@example.com"
subject="An Error Occurred!"
level="debug"
/>
</monolog:config>
</container>
PHP:
// app/config/config_prod.php
$container->loadFromExtension('monolog', array(
'handlers' => array(
'main' => array(
'type' => 'fingers_crossed',
'action_level' => 'critical',
'handler' => 'grouped',
),
'grouped' => array(
'type' => 'group',
'members' => array('streamed', 'buffered'),
),
'streamed' => array(
'type' => 'stream',
'path' => '%kernel.logs_dir%/%kernel.environment%.log',
'level' => 'debug',
),
'buffered' => array(
'type' => 'buffer',
'handler' => 'swift',
),
'swift' => array(
'type' => 'swift_mailer',
'from_email' => 'error@example.com',
'to_email' => 'error@example.com',
'subject' => 'An Error Occurred!',
'level' => 'debug',
),
),
));
這個(gè)使用了 group handler 來向兩個(gè)組員發(fā)送消息,buffered 和 stream handlers?,F(xiàn)在這些消息既被記錄在日志中又被電子郵件發(fā)送出去了。