How to Configure Monolog to Display Console Messages
Warning: You are browsing the documentation for Symfony 2.x, which is no longer maintained.
Read the updated version of this page for Symfony 7.1 (the current stable version).
It is possible to use the console to print messages for certain verbosity levels using the OutputInterface instance that is passed when a command gets executed.
See also
Alternatively, you can use the standalone PSR-3 logger provided with the console component.
When a lot of logging has to happen, it's cumbersome to print information
depending on the verbosity settings (-v
, -vv
, -vvv
) because the
calls need to be wrapped in conditions. For example:
1 2 3 4 5 6 7 8 9 10 11 12 13
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
protected function execute(InputInterface $input, OutputInterface $output)
{
if ($output->isDebug()) {
$output->writeln('Some info');
}
if ($output->isVerbose()) {
$output->writeln('Some more info');
}
}
Instead of using these semantic methods to test for each of the verbosity levels, the MonologBridge provides a ConsoleHandler that listens to console events and writes log messages to the console output depending on the current log level and the console verbosity.
The example above could then be rewritten as:
1 2 3 4 5 6 7 8 9 10 11
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
protected function execute(InputInterface $input, OutputInterface $output)
{
// assuming the Command extends ContainerAwareCommand...
$logger = $this->getContainer()->get('logger');
$logger->debug('Some info');
$logger->notice('Some more info');
}
Depending on the verbosity level that the command is run in and the user's configuration (see below), these messages may or may not be displayed to the console. If they are displayed, they are timestamped and colored appropriately. Additionally, error logs are written to the error output (php://stderr). There is no need to conditionally handle the verbosity settings anymore.
The Monolog console handler is enabled in the Monolog configuration. This is the default in Symfony Standard Edition 2.4 too.
1 2 3 4 5
# app/config/config.yml
monolog:
handlers:
console:
type: console
With the verbosity_levels
option you can adapt the mapping between
verbosity and log level. In the given example it will also show notices in
normal verbosity mode (instead of warnings only). Additionally, it will only
use messages logged with the custom my_channel
channel and it changes the
display style via a custom formatter (see the
MonologBundle reference for more
information):
1 2 3 4 5 6 7 8 9
# app/config/config.yml
monolog:
handlers:
console:
type: console
verbosity_levels:
VERBOSITY_NORMAL: NOTICE
channels: my_channel
formatter: my_formatter
1 2 3 4 5 6
# app/config/services.yml
services:
my_formatter:
class: Symfony\Bridge\Monolog\Formatter\ConsoleFormatter
arguments:
- "[%%datetime%%] %%start_tag%%%%message%%%%end_tag%% (%%level_name%%) %%context%% %%extra%%\n"