Symfonyで用いられているMonologには、channelという概念があります。channelはロガーインスタンスに対する識別子で、このchannelを使うとログの出力先や出力形式を適宜変更することができます。
デフォルトのロガーはappというchannelが割り当てられています。
public function foo(LoggerInterface $logger)
{
$logger->info('ok');
}
[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チャンネルの内容もデフォルトのファイル出力の対象となります。
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らしくて趣がありますね()。
