当前位置: 首页 > 知识库问答 >
问题:

Symfony 3.4记录器服务

寿意远
2023-03-14

当我调用logger服务在日志文件中获取此信息消息时,它工作正常,但将此消息写入日志文件:

php.INFO:User Deprecated:The“logger”服务是私有的,从容器中获取它是不推荐的,因为Symfony 3.2,并且将在4.0中失败。您应该公开服务,或者停止直接使用容器,改用依赖项注入。{“异常”:“[object](ErrorException(代码:0):用户已弃用:记录器\”\“服务是私有的,自Symfony 3.2以来,从容器中获取服务已被弃用,并将在4.0中失败。您应该将服务公开,或者停止直接使用容器,改用依赖注入。at/home/***/####/PROJECT/vendor/Symfony/Symfony/src/Symfony/Component/dependenceinjection/container.php:275)”[]

My symfony版本:3.4.1

共有2个答案

阎弘雅
2023-03-14

$this-

柳俊健
2023-03-14

如Symfony 3.4所述,默认情况下,monogbundle提供的logger服务和所有其他服务都设置为private。[原文如此]

要解决此问题,建议使用依赖项注入。http://symfony.com/doc/3.4/logging.html

namespace AppBundle\Controller;

use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
     public function indexAction(LoggerInterface $logger)
     {
        $logger->info('Your Message');
     }
}

源代码参考:https://github.com/symfony/monolog-bundle/blob/v3.1.0/Resources/config/monolog.xml#L17

对于服务定义,当启用autowire时,依赖注入可用。

#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
    AppBundle\Controller\:
        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
    #AppBundle\Service\MyService: 
    #    public: true

    #alternatively declare the namespace explicitly as public
    #AppBundle\Service\:
    #    resource: '../../src/AppBundle/Service/*'
    #    public: true

然后,若要将依赖项注入到服务中,请将参数的类型提示添加到构造函数中。

namespace AppBundle\Service;

use Psr\Log\LoggerInterface;

class MyService
{

    private $logger;
    
    public function __construct(LoggerInterface $logger)
    {
         $this->logger = $logger;
    }
   
}

如果禁用了autowire,则可以手动定义服务以注入记录器别名。

#app/config/services.yml

services:

    AppBundle\Service\MyService:
        arguments: ['@logger']
        public: true

或者,要强制从容器公开访问记录器别名,可以在应用程序服务配置中重新声明服务别名。

#app/config/services.yml

services:

    #...
    
    logger:
        alias: 'monolog.logger'
        public: true

您也可以在编译器传递中将记录器设置为公共服务,而不是重写配置中的值。https://symfony.com/doc/4.4/service_container/compiler_passes.html

Symfony Flex

// src/Kernel.php
namespace App;

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel 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);
    }

}

Symfony束

// src/AppBundle/AppBundle.php
namespace AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use AppBundle\DependencyInjection\Compiler\CustomPass;

class AppBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        $container->addCompilerPass(new CustomPass());
    }
}
// src/AppBundle/DependencyInjection/Compiler/CustomPass.php
namespace AppBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CustomPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $container->getDefinition('logger')->setPublic(true);
    }
}
 类似资料:
  • 问题内容: 我对如何将日志条目直接放入(而不是logstash)感到有些困惑。到目前为止,我发现了一些附加目的地(,等等),允许将日志发送到远程主机,也可能这似乎让我们日志转换为“弹性友好”的格式,但这种方法看起来古怪......还是我错误?这是将日志发送到的一种方法吗? 到目前为止,我有这样的配置: 但是我得到一个错误: 我找不到任何有用的示例,所以我无法理解我该怎么做以及如何解决。谢谢。 问题

  • 我已经以域模式格式配置了我的WildFly 18服务器,我们使用log4j记录器。当我签入服务器时。日志文件,所有来自log4j的日志都以wildfly自己的日志格式记录。如下面第1行所示,第一个日期和日志级别来自服务器日志,下一个日期格式和日志级别以及日志消息来自log4j。 我搜索了很多...我发现了很多与独立模式相关的配置,有些人说这些配置可以在domain.xml中完成,但都不起作用 我在

  • 我刚刚为我们的微服务环境在前端创建了简单的Zuul代理,但现在我想将所有条目记录到通过代理的日志文件中。 做任何我需要做的事情。

  • 问题内容: 我想在我的应用程序中将slf4j + logback用于两个目的-日志和审计。 对于日志记录,我以常规方式记录日志: 对于审计,我创建一个特殊的命名记录器并登录到它: 登录配置: 问题:通过审核记录器记录的消息出现两次-一次在AUDIT_LOGGER下,一次在根记录器下。 14:41:57.975 [main]调试com.gammay.example.Main–> main() 14:

  • 我使用ESAPI jar进行验证。当我调用isValidInput(Context,input.trim(),ValidateConstant时。APLHA_NUMERIC_TYPE,最大长度,真);或isValidInput(上下文,输入,ValidateConstant.NUMERIC_TYPE,maxLength,true);并且输入错误,带有单独的字符。然后它抛出一些像 当我单独执行程序时

  • 我需要一种在java中记录这个XML响应的方法。当我从我的java发送请求时,这是返回的。我需要一种打印出响应描述的方法。 下面是我的java代码: