我无法在 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');
现在文件已创建,日志中显示了配置的频道。
非常感谢大家!!!
我尝试在 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');
现在文件已创建,日志中显示了配置的频道。
非常感谢大家!!!