6

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.

1 Answer 1

2

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 \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
   }

You can also use the Psr\Log\LoggerAwareInterface (which is as simple as use the Psr\Log\LoggerAwareTrait) 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.

Sign up to request clarification or add additional context in comments.

2 Comments

That seems to work in my command, although for some reason I also had to clear the cache to get it to work. If I didn't I got an error. However the error is the same as when I try to inject the logger into another class I'm using. Too few arguments to function App\Util\Labelprinter::__construct(), 0 pas sed in C:\inetpub\wwwroot\Test5\src\Command\FolderCommand.php on line 228 a nd exactly 1 expected
Symfony's dependency container is compiled and cached, so it's not unusual having to clear cache while developing.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.