我无法在 Symfony 3.4 中使用带有 Monolog 的特定通道将日志写入文件

I can't write logs to a file using a specific channel with Monolog in Symfony 3.4

我尝试在 Symfony 3.4 的命令中使用 Monolog 中的特定通道(称为 encuestas_cloud)将日志写入特定文件,但我无法做到。

我已经阅读了 Symfony 文档并在网上进行了搜索,我认为它的配置很好,但我收到了一个错误。

密码是:

在config_dev.yml中:

monolog:

  handlers:
    main:
        type: stream
        path: '%kernel.logs_dir%/%kernel.environment%.log'
        level: debug
        channels: ['!event']

  ...
    encuestas_cloud_logger:
        #type: rotating_file
        type: stream
        path: 'D:/web/xampp/htdocs/temp/logs/encuestas_cloud.log'
        level: info
        channels: ['encuestas_cloud']   
        max_files: 10       

在services.yml

services:
  _defaults:
     autowire: true
     autoconfigure: true
     public: false

  AppBundle\Command\EncuestasCloudCommand\:
    resource: '../../src/AppBundle/Command/EncuestasCloudCommand.php'
    arguments: ['@logger']
    public: true
    tags:
        - { name: monolog.logger, channel: encuestas_cloud } 

命令:

// src/AppBundle/Command/EncuestasCloudCommand.php
namespace AppBundle\Command;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
...

class EncuestasCloudCommand extends ContainerAwareCommand

{
  private $logger;

  public function __construct(LoggerInterface $logger)
  {
    $this->logger = $logger;
    parent::__construct();
  }

 ...
 protected function execute(InputInterface $input, OutputInterface $output)
 {

    $logger = $this->logger;
    $logger->addInfo('My logger is now ready');

当我执行它时,我得到:

In LoggerChannelPass.php line 98:

Monolog configuration error: The logging channel "encuestas_cloud" assigned to the
"encuestas_cloud_logger" handler does not exist.

In ContainerBuilder.php line 1063:

You have requested a non-existent service "monolog.logger.encuestas_cloud".

如果我在config_dev.yml

中添加channels: ['encuestas_cloud']
monolog:
  channels: ['encuestas_cloud'] 

  handlers:
    main:
        type: stream
...

错误消失但日志仍然转到通用日志文件:dev.log

拜托,有人可以帮我找出配置有什么问题吗?

非常感谢!!!

将命令的参数从 @logger 更改为 @monolog.logger.encuestas_cloud 是否有效?那应该注入特定配置的记录器,因此您的日志记录将出现在正确的记录器中。

monolog:
  channels: ['encuestas_cloud']

应该定义 AFAIK,并明确排除您的 main 记录器的频道,以免出现在那里:

monolog:
    handlers:
        main:
            ...
            channels: [ '!encuestas_cloud' ]

非常感谢evertjes您的回答,它并没有解决问题,但帮助我调查了其他路径...

问题是命令没有以正确的方式定义为服务,因此 Symfony 无法将通道与服务(以及命令)相匹配。

我执行了:

php bin/console debug:container

命令的服务没有出现。

因此,在研究了如何将命令定义为服务之后,配置工作正常... uffff。

我在这里 post 最终有效的代码。

在config_dev.yml中:

monolog:
  channels: ['encuestas_cloud']

  handlers:
    main:
        type: stream
        path: '%kernel.logs_dir%/%kernel.environment%.log'
        level: debug
        channels: ['!event','!encuestas_cloud']

  ...
    encuestas_cloud_logger:
        type: rotating_file
        path: 'D:/web/xampp/htdocs/temp/logs/encuestas_cloud.log'
        level: info
        channels: ['encuestas_cloud']   
        max_files: 10       

在services.yml

services:
  _defaults:
     autowire: true
     autoconfigure: true
     public: false

  console.command.encuestas_cloud_command:
    class: 'AppBundle\Command\EncuestasCloudCommand'
    arguments: ['@logger']
    public: true
    tags:
        - { name: monolog.logger, channel: encuestas_cloud }  

命令:

// src/AppBundle/Command/EncuestasCloudCommand.php
namespace AppBundle\Command;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
...

class EncuestasCloudCommand extends ContainerAwareCommand

{
  private $logger;

  public function __construct(LoggerInterface $logger)
  {
    $this->logger = $logger;
    parent::__construct();
  }

 ...
 protected function execute(InputInterface $input, OutputInterface $output)
 {

    $logger = $this->logger;
    $logger->addInfo('My logger is now ready');

现在文件已创建,日志中显示了配置的频道。

非常感谢大家!!!