I’ve recently gone from using Symfony 2.7 to 4.2.
Previously in my commands in order to log to a file I used something like:
$logger = $this->getContainer()->get('logger'); $logger->error('put this in log');
This functionality appears to have changed. I can log from a controller following https://symfony.com/doc/current/logging.html
I can output to the console using:
$logger = new ConsoleLogger($output); $logger->log('error','Put this in the log file');
But as much as I stare at the information on the symfony website I just can’t figure out how to log to a file using symfony 4.2 from a command.
Advertisement
Answer
You need to inject the logger into your command, similarly as it is shown for the controller example.
class ExampleCommand extends Command { protected static $defaultName = 'do:something:awesome'; /** * @var PsrLogLoggerInterface */ 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 }
You can also use the PsrLogLoggerAwareInterface
(which is as simple as use the PsrLogLoggerAwareTrait
) and the logger will be injected automatically if available.
class FooBar extends Command implements LoggerAwareInterface { use LoggerAwareTrait; // rest of the class implementation }
With this you do not even need to use constructor injection, since Symfony will automatically call setLogger()
on your command to inject the logger for you.
Your command will use the same logger configuration than the rest of your project, and you’ll be logging to files in no time.