Handler 的繼承關係如下(使用 YAML 表示):
- HandlerInterface:
- AbstractHandler:
- AbstractProcessingHandler:
- AbstractSyslogHandler:
- SyslogHandler
- SyslogUdpHandler
- AmqpHandler
- BrowserConsoleHandler
- ChromePHPHandler
- CouchDBHandler
- CubeHandler
- DoctrineCouchDBHandler
- DynamoDbHandler
- ElasticSearchHandler
- ErrorLogHandler
- FirePHPHandler
- GelfHandler
- IFTTTHandler
- LogglyHandler
- MailHandler:
- MandrillHandler
- NativeMailerHandler
- SwiftMailerHandler
- MongoDBHandler
- NewRelicHandler
- PHPConsoleHandler
- RavenHandler
- RedisHandler
- RollbarHandler
- SlackbotHandler
- SlackWebhookHandler
- SocketHandler:
- FleepHookHandler
- FlowdockHandler
- HipChatHandler
- LogEntriesHandler
- PushoverHandler
- SlackHandler
- StreamHandler:
- RotatingFileHandler
- TestHandler
- ZendMonitorHandler
- BufferHandler:
- DeduplicationHandler
- FilterHandler
- FingersCrossedHandler
- GroupHandler:
- WhatFailureGroupHandler
- NullHandler
- PsrHandler
- SamplingHandler
- HandlerWrapper
洋洋灑灑列出一長串的 Class 名稱,大部分是單純實作服務的串接,有另一小部分的 Handler 是有特殊用途的,撿幾個來介紹。
這個 Handler 是設計用來做測試的,比方說:
$logger = new \Monolog\Logger('name');
$handler = new \Monolog\Handler\TestHandler();
$logger->pushHandler($handler);
$logger->warning('test');
var_dump($handler->hasAlertRecords());
var_dump($handler->hasWarningRecords());
這樣輸出的結果會是:
bool(false)
bool(true)
它可以作為一個 spy ,去確認寫到 Logger 的內容是正確的。
它的設計方法也很單純,在 write 去寫入一個陣列:
protected function write(array $record)
{
$this->recordsByLevel[$record['level']][] = $record;
$this->records[] = $record;
}
而在 assertion 的方法去找陣列有沒有對應的值即可,非常厲害。
這可以把多個 Handler 集合成一個 Group ,而對這個 Group 操作,就等於對全部的 Handler 操作。
它的說明很有趣:
Blackhole
所有的 Log 將會像是遇到無底洞一樣,全部被這個 Handler 吃光光。
這也是設計用來測試用的。
覺得 Monolog 不好,但有中意其他 PSR Logger 。雖然傷心寂寞覺得冷,但還是可以考慮用 Monolog 的 PsrHandler 包裝其他 PSR Logger 哦。