跳到内容

使用日志记录器

编辑此页

Console 组件带有一个符合 PSR-3 标准的独立日志记录器。根据详细程度设置,日志消息将发送到作为参数传递给构造函数的 OutputInterface 实例。

除了 psr/log 之外,该记录器没有任何外部依赖项。这对于需要轻量级 PSR-3 兼容记录器的控制台应用程序和命令非常有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace Acme;

use Psr\Log\LoggerInterface;

class MyDependency
{
    public function __construct(
        private LoggerInterface $logger,
    ) {
    }

    public function doStuff(): void
    {
        $this->logger->info('I love Tony Vairelles\' hairdresser.');
    }
}

您可以依赖该记录器在命令内部使用此依赖项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace Acme\Console\Command;

use Acme\MyDependency;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Logger\ConsoleLogger;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(
    name: 'my:command',
    description: 'Use an external dependency requiring a PSR-3 logger'
)]
class MyCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $logger = new ConsoleLogger($output);

        $myDependency = new MyDependency($logger);
        $myDependency->doStuff();

        return Command::SUCCESS;
    }
}

该依赖项将使用 ConsoleLogger 的实例作为记录器。发出的日志消息将显示在控制台输出中。

详细程度

根据命令运行的详细程度级别,消息可能会或可能不会发送到 OutputInterface 实例。

默认情况下,控制台记录器的行为类似于 Monolog 的控制台处理器。日志级别和详细程度之间的关联可以通过 ConsoleLogger 构造函数的第二个参数进行配置

1
2
3
4
5
6
7
8
9
use Psr\Log\LogLevel;
// ...

$verbosityLevelMap = [
    LogLevel::NOTICE => OutputInterface::VERBOSITY_NORMAL,
    LogLevel::INFO   => OutputInterface::VERBOSITY_NORMAL,
];

$logger = new ConsoleLogger($output, $verbosityLevelMap);

颜色

记录器输出的日志消息使用反映其级别的颜色进行格式化。此行为可以通过构造函数的第三个参数进行配置

1
2
3
4
5
6
7
// ...
$formatLevelMap = [
    LogLevel::CRITICAL => ConsoleLogger::ERROR,
    LogLevel::DEBUG    => ConsoleLogger::INFO,
];

$logger = new ConsoleLogger($output, [], $formatLevelMap);

错误

Console 记录器包含一个 hasErrored() 方法,只要在命令执行期间记录了任何错误消息,该方法就会返回 true。这对于决定返回哪个状态代码作为执行命令的结果非常有用。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本