Symfonyで用いられているMonolog
には、channel
という概念があります。channel
はロガーインスタンスに対する識別子で、このchannel
を使うとログの出力先や出力形式を適宜変更することができます。
デフォルトのロガーはapp
というchannel
が割り当てられています。
public function foo(LoggerInterface $logger)
{
$logger->info('ok');
}
var/log/dev.log
[2021-12-16T14:12:10.924725+00:00] app.INFO: ok [] [] # appの部分がchannel
例えば、次のような設定を行うとapp
チャンネルのほかにfoo
というチャンネルが作られます。
Slackへ通知を行うslack
ハンドラーを定義しハンドラーのchannel
にfoo
を設定すると、foo
チャンネルに流れてきたログはSlackへ流れていきます。
また、main
ハンドラーに設定してあるチャンネルは["!event"]
ですが、こちらは「event
チャンネル以外」を意味するので、foo
チャンネルの内容もデフォルトのファイル出力の対象となります。
config/dev/monolog.yaml
monolog:
channels: ['foo']
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
channels: ["!event"]
slack:
type: slack
token: xxxxxxxx
channel: xxxxxxxx
channels: ["foo"]
図で表すと以下のような感じです。
特定のチャンネルに設定されたロガーを取得するには、LoggerInterface
をDIするときに引数の名前を$<チャンネル名>lLogger
にします。foo
チャンネルのロガーを取得する場合はこのようになります。
public function foo(LoggerInterface $fooLogger)
{
$fooLogger->info('ok');
}
なんともPHPらしくて趣がありますね()。