este problema se puede resolver de diferentes formas, por lo tanto te damos la solución más completa en nuestra opinión.
Solución:
Como se indica en Symfony 3.4, el logger
servicio proporcionado por el MonologBundle
y todos los demás servicios, están configurados como privados de forma predeterminada. [sic]
Para solucionar el problema, el método recomendado es utilizar la inyección de dependencia. http://symfony.com/doc/3.4/logging.html
namespace AppBundleController;
use PsrLogLoggerInterface;
use SymfonyBundleFrameworkBundleControllerController;
class DefaultController extends Controller
public function indexAction(LoggerInterface $logger)
$logger->info('Your Message');
Referencia del código fuente: https://github.com/symfony/monolog-bundle/blob/v3.1.0/Resources/config/monolog.xml#L17
Para las definiciones de servicio, la inyección de dependencia está disponible cuando autowire
está habilitado. [sic]
#app/config/services.yml
services:
# default configuration for services in *this* file
_defaults:
# automatically injects dependencies in your services
autowire: true
# automatically registers your services as commands, event subscribers, etc.
autoconfigure: true
# this means you cannot fetch services directly from the container via $container->get()
# if you need to do this, you can override this setting on individual services
public: false
# makes classes in src/AppBundle available to be used as services
# this creates a service per class whose id is the fully-qualified class name
AppBundle:
resource: '../../src/AppBundle/*'
# you can exclude directories or files
# but if a service is unused, it's removed anyway
exclude: '../../src/AppBundle/Entity,Repository,Tests'
#enables dependency injection in controller actions
AppBundleController:
resource: '../../src/AppBundle/Controller'
public: true
tags: ['controller.service_arguments']
#all of your custom services should be below this line
#which will override the above configurations
#optionally declare an individual service as public
#AppBundleServiceMyService:
# public: true
#alternatively declare the namespace explicitly as public
#AppBundleService:
# resource: '../../src/AppBundle/Service/*'
# public: true
Luego, para inyectar la dependencia en el servicio, agrega la sugerencia de tipo para el argumento al constructor.
namespace AppBundleService;
use PsrLogLoggerInterface;
class MyService
private $logger;
public function __construct(LoggerInterface $logger)
$this->logger = $logger;
Si autowire
está deshabilitado, puede definir manualmente sus servicios para inyectar el alias del registrador.
#app/config/services.yml
services:
AppBundleServiceMyService:
arguments: ['@logger']
public: true
Alternativamente, para forzar que el alias del registrador sea accesible públicamente desde el contenedor, puede volver a declarar el alias del servicio en la configuración de servicios de su aplicación.
#app/config/services.yml
services:
#...
logger:
alias: 'monolog.logger'
public: true
En lugar de anular el valor en la configuración, también puede configurar el registrador como un servicio público en una pasada del compilador. https://symfony.com/doc/4.4/service_container/compiler_passes.html
Symfony Flex
// src/Kernel.php
namespace App;
use SymfonyBundleFrameworkBundleKernelMicroKernelTrait;
use SymfonyComponentDependencyInjectionCompilerCompilerPassInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentHttpKernelKernel as BaseKernel;
class Kernel extends BaseKernel implements CompilerPassInterface
use MicroKernelTrait;
public function process(ContainerBuilder $container)
// in this method you can manipulate the service container:
// for example, changing some container service:
$container->getDefinition('logger')->setPublic(true);
Paquete Symfony
// src/AppBundle/AppBundle.php
namespace AppBundle;
use SymfonyComponentHttpKernelBundleBundle;
use SymfonyComponentDependencyInjectionContainerBuilder;
use AppBundleDependencyInjectionCompilerCustomPass;
class AppBundle extends Bundle
public function build(ContainerBuilder $container)
parent::build($container);
$container->addCompilerPass(new CustomPass());
// src/AppBundle/DependencyInjection/Compiler/CustomPass.php
namespace AppBundleDependencyInjectionCompiler;
use SymfonyComponentDependencyInjectionCompilerCompilerPassInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;
class CustomPass implements CompilerPassInterface
public function process(ContainerBuilder $container)
$container->getDefinition('logger')->setPublic(true);
$this->container->get('logger')
falla porque el registrador ahora (a partir de 3.2) está marcado como un servicio privado, todos los servicios son privados de forma predeterminada, lo que significa que estos servicios no se pueden devolver desde el contenedor y, en su lugar, deben inyectarse dependencias (el constructor de la clase debe tomar el registrador como parámetro y convertirse en una propiedad de la clase para ser accesible), o marcado como público en la configuración del servicio, y dado que el registrador es un componente de Symfony, la configuración del servicio está dentro del proyecto Symfony, tendrías que copiar el registrador configuración de Symfony a la configuración del servicio de su proyecto y agregue public: true
, para acceder a la instancia del registrador desde el contenedor.
Al final de todo puedes encontrar las referencias de otros usuarios, tú igualmente tienes la libertad de dejar el tuyo si lo crees conveniente.