跳到内容

如何将消息记录到不同的文件

编辑此页

Symfony 框架将日志消息组织到通道中。默认情况下,有多个通道,包括 doctrineeventsecurityrequest 等。通道会打印在日志消息中,也可以用于将不同的通道定向到不同的位置/文件。

默认情况下,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 中引入。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本