php - 如何在 Symfony 4 的控制台命令中使用记录器?

标签 php symfony dependency-injection symfony4

我最近从使用 Symfony 2.7 到 4.2。

以前在我的命令中为了登录到一个文件,我使用了类似的东西:

$logger = $this->getContainer()->get('logger');
$logger->error('put this in log');

此功能似乎已更改。我可以从 Controller 登录 https://symfony.com/doc/current/logging.html

我可以使用以下命令输出到控制台:
$logger = new ConsoleLogger($output);
$logger->log('error','Put this in the log file');

但是,尽管我盯着 symfony 网站上的信息看,我只是不知道如何从命令中使用 symfony 4.2 登录到文件。

最佳答案

您需要将记录器注入(inject)到您的命令中,类似于 Controller 示例所示。


class ExampleCommand extends Command {

    protected static $defaultName = 'do:something:awesome';
    /**
     * @var \Psr\Log\LoggerInterface
     */
    private $logger;

    public function __construct(  LoggerInterface $logger  ) {

        $this->$logger = $logger;

        parent::__construct(  );
    }

    public function execute( InputInterface $input, OutputInterface $output ) {
        $io = new SymfonyStyle( $input, $output );
        $this->logger->info('Logging like a boss at ' . __FILE__ . ':' . __LINE__);

       // the rest of your command
   }

您也可以使用 Psr\Log\LoggerAwareInterface (就像使用 Psr\Log\LoggerAwareTrait 一样简单),如果可用,记录器将自动注入(inject)。
class FooBar extends Command implements LoggerAwareInterface
{

    use LoggerAwareTrait;

// rest of the class implementation

}

有了这个,你甚至不需要使用构造函数注入(inject),因为 Symfony 会自动调用 setLogger()根据您的命令为您注入(inject)记录器。

您的命令将使用与项目其余部分相同的记录器配置,并且您将立即记录到文件。

关于php - 如何在 Symfony 4 的控制台命令中使用记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54689258/

相关文章:

symfony2 表单错误

ios - 为什么 Objective-C 中的 Ioc-Containers 不是一种流行的方法?

c# - 使用 AutoFac 根据构造函数参数名传递不同的实例

php - 使用 php 对查询进行分组

javascript - 响应值在 ajax 中重叠

php - OAuthException : redirect_uri isn't an absolute URI. 检查 RFC 3986 (Symfony)

symfony - 在奏鸣曲管理员中使用额外字段坚持多对多

c# - 如何避免依赖注入(inject)构造函数的疯狂?

php - PHP形式的验证码刷新

php - 在数据库中添加用户的逻辑