如何将消息记录到不同的文件
Symfony 框架将日志消息组织到通道中。默认情况下,有多个通道,包括 doctrine
、event
、security
、request
等。通道会打印在日志消息中,也可以用于将不同的通道定向到不同的位置/文件。
默认情况下,Symfony 将每个消息记录到单个文件中(无论通道如何)。
注意
每个通道对应于不同的 logger 服务 (monolog.logger.XXX
)。使用 php bin/console debug:container monolog
命令查看完整的服务列表,并了解 如何自动装配 monolog 通道。
将通道切换到不同的处理器
现在,假设您想将 security
通道记录到不同的文件中。为此,创建一个新的处理器,并将其配置为仅记录来自 security
通道的消息。以下示例仅在 prod
配置环境 中执行此操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# config/packages/monolog.yaml
when@prod:
monolog:
handlers:
security:
# log all messages (since debug is the lowest level)
level: debug
type: stream
path: '%kernel.logs_dir%/security.log'
channels: [security]
# an example of *not* logging security channel messages for this handler
main:
# ...
# channels: ['!security']
警告
channels
配置仅适用于顶级处理器。嵌套在 group、buffer、filter、fingers crossed 或其他此类处理器中的处理器将忽略此配置,并将处理传递给它们的每个消息。
您可以通过不同的方式指定配置
1 2 3 4 5 6 7
channels: ~ # Include all the channels
channels: foo # Include only channel 'foo'
channels: '!foo' # Include all channels, except 'foo'
channels: [foo, bar] # Include only channels 'foo' and 'bar'
channels: ['!foo', '!bar'] # Include all channels, except 'foo' and 'bar'
创建您自己的通道
您可以一次更改 Monolog 日志记录到的一个服务的通道。这可以通过下面的 配置 完成,或者通过使用 monolog.logger 标记您的服务并指定服务应记录到的通道来完成。使用标签,注入到该服务中的 logger 预配置为使用您指定的通道。
配置没有标签服务的其他通道
您还可以配置其他通道,而无需标记您的服务
1 2 3
# config/packages/monolog.yaml
monolog:
channels: ['foo', 'bar', 'foo_bar']
Symfony 自动为每个通道注册一个服务(在此示例中,通道 foo
创建一个名为 monolog.logger.foo
的服务)。为了将此服务注入到其他服务中,您必须更新服务配置以 选择要注入的特定服务。
如何自动装配 Logger 通道
从 MonologBundle 3.5 开始,您可以通过使用以下语法对服务参数进行类型提示来自动装配不同的 Monolog 通道:Psr\Log\LoggerInterface $<camelCased channel name> + Logger
。<channel>
必须已在您的 Monolog 配置中预定义。
例如,要注入与 foo_bar
logger 通道相关的服务,请像这样更改您的构造函数
1 2 3 4 5
public function __construct(
- LoggerInterface $logger,
+ LoggerInterface $fooBarLogger,
) {
}
使用属性配置 Logger 通道
从 Monolog 3.5 开始,您还可以通过直接在您的服务类上使用 #[WithMonologChannel]
属性来配置 logger 通道
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// src/Service/MyFixtureService.php
namespace App\Service;
use Monolog\Attribute\WithMonologChannel;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Monolog\Logger;
#[WithMonologChannel('fixtures')]
class MyFixtureService
{
public function __construct(LoggerInterface $logger)
{
// ...
}
}
这样,您可以避免手动声明您的服务以使用特定通道。
3.5
#[WithMonologChannel]
属性在 Monolog 3.5.0 中引入。