登录 Symfony 3 有什么不对

What isn't right with logging in Symfony 3

我在不同的文件中为不同的通道配置了记录器,但它对我不起作用。它的工作,但它写在控制台而不是指向文件中。 我需要在频道搜索中将日志写入文件。 这是我的代码:

#app/config/config_dev.yml
monolog:
    handlers:
        search:
            type: stream
            level: error
            path: "%kernel.logs_dir%/search_log.log"
            channels: [search]
        main:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
            channels: [!event, !search]
        console:
            type:   console
            channels: [!event, !doctrine, !search]

定义的服务:

#MyBundle/Resources/config/services.yml
services:
    app.logger_search:
            class: Symfony\Bridge\Monolog\Logger
            arguments: ["@logger"]
            tags:
                - {name: monolog.logger, channel: search}

现在使用it服务,试试看:

#MyController.php

/**
 * @Route("/test")
 */
public function test()
{
    $this->get("app.logger_search")->error("Test");

    return $this->json("test");
}

但它会写入文件的控制台。 控制台 我的意思是我 运行 我的服务器:php bin\console server:run.

创建您自己的频道。这可以通过 configuration or by tagging your servicemonolog.logger 并指定服务应登录到哪个频道(就像您所做的那样)来完成。

两种方式都有效,在这两种情况下,您的记录器都将被命名为:

monolog.logger.<you-channel-name>

因此请使用 monolog.logger.search 而不是您的服务 ID app.logger_search 来解决问题。

如果您没有充分理由更改记录器行为,我建议 configure additional channels without tagged services:

# app/config/config.yml
monolog:
    channels: ['foo', 'bar']

有了这个,您现在可以使用自动注册的记录器服务 monolog.logger.foo.

将日志消息发送到 foo 频道