在此cookbook article中,我们可以了解如何在服务中使用自定义渠道。但是如何在命令中使用自定义登录通道?
我创建了一个symfony2命令来执行某些操作。我想使用monolog记录我的命令完成的事情。
实际上,我想在另一个文件中为我的命令编写日志而不是应用程序的日志。
答案 0 :(得分:6)
任何扩展ContainerAwareCommand
的自定义命令都可以访问Symfony的服务容器。您可以定义在配置中登录自定义渠道的服务。
<services>
<service id="console.logger" parent="monolog.logger_prototype">
<argument index="0">mychannel</argument>
</service>
</services>
您可以通过以下方式从命令访问您的服务
$logger = $this->getContainer()->get('console.logger');
此记录器将使用频道记录为“mychannel”。
FYI默认记录器服务记录到频道“app”。这可以在文件中看到
Symfony/Bundle/MonologBundle/Resources/config/monolog.xml
。这也是定义默认logger
服务的地方。
<services>
<service id="monolog.logger" parent="monolog.logger_prototype" public="false">
<argument index="0">app</argument>
</service>
<service id="logger" alias="monolog.logger" />
<service id="monolog.logger_prototype" class="%monolog.logger.class%" abstract="true">
<argument /><!-- Channel -->
</service>
</services>
答案 1 :(得分:4)
答案 2 :(得分:4)
试试这个,直接使用库
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// ...
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path of log file', Logger::WARNING));
//add the erros to log file
try {
//do something
} catch(Exception $e) {
$log->addError($e->getMessage());
}
也许这可以解决您的问题,将其添加到您的命令文件中。
答案 3 :(得分:0)
在大多数情况下,您的命令扩展了ContainerAwareCommand(如下所示:http://symfony.com/doc/current/cookbook/console.html#creating-a-basic-command)。
这意味着您的命令可以访问Symfony的服务容器 - 这是Symfony内部所有服务的大包(即有用的对象)。在您的情况下,您需要logger
服务,您可以通过将其从容器中取出来获得:
$logger = $this->getContainer()->get('logger');
(参考:http://symfony.com/doc/current/cookbook/console.html#getting-services-from-the-service-container)
现在您可以正常使用记录器了。如果您需要任何其他服务,只需查看php app/console container:debug
命令,该命令列出容器上的每个服务。
答案 4 :(得分:0)
对于Symfony 3.3,因为当您想要登录单独的文件时使用自动服务,请遵循以下方法:
例如,让我们假设我们需要登录2个旋转文件:
exception.log
:适用于应用程序中的异常。dataFetch.log
:用于调用api来检索应用程序数据。 on services.yml
put:
monolog:
channels: ['dataFetch', 'exception']
handlers:
dataFetch:
type: 'rotating_file'
level: info
type: stream
path: 'dataFetch.log'
max_files: 7
channels: dataFetch
exception:
type: 'rotating_file'
level: error
type: stream
path: 'exception.log'
max_files: 7
channels: exception
现在,对于异常loger,您可以为monolog.logger.exception
注入广告依赖关系,而对于dataFetch,您可以依赖注入monolog.logger.dataFetch
。