Php 为什么Symfony仍然登录到dev.log文件,即使我没有';你不能在loghandler中定义它吗?

Php 为什么Symfony仍然登录到dev.log文件,即使我没有';你不能在loghandler中定义它吗?,php,symfony,logging,monolog,Php,Symfony,Logging,Monolog,在执行Symfony命令期间,我希望将消息记录到另一个文件中。我已经阅读了Symfony和Monolog文档,它应该像我在这里描述的那样工作。(注意,我知道来自“条令”、“事件”和…通道的消息仍将由主处理程序记录,但这对我来说并不重要) 在我的config.yml中,我有: monolog: channels: [commandline] handlers: main: type: stream path: "%

在执行Symfony命令期间,我希望将消息记录到另一个文件中。我已经阅读了Symfony和Monolog文档,它应该像我在这里描述的那样工作。(注意,我知道来自“条令”、“事件”和…通道的消息仍将由主处理程序记录,但这对我来说并不重要)

在我的
config.yml
中,我有:

monolog:
    channels: [commandline]
    handlers:
        main:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.main.log"
            level: debug
            channels: [!commandline]
        commandline:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.commandline.log"
            level: debug
            channels: commandline
        stdout:
            type:  stream
            path:  "php://stdout"
            level: debug
            channels: commandline
        mail:
            type:         stream
            action_level: alert
            handler:      buffered_mail
        buffered_mail:
            type:    buffer
            handler: swift
        swift:
            type:       swift_mailer
            from_email: some@email.com
            to_email:   some@email.com
            subject:    "Something went wrong"
            level:      alert
我希望有两个日志文件:
dev.main.log
dev.commandline.log
。 但是我还有第三个日志文件:
dev.log
,它记录所有的消息。 我似乎找不到loghandler是在哪里定义的,也找不到如何防止它记录东西

如果有人能给我指出正确的方向,那就太好了

顺便说一句,我正在使用:

  • symfony 2.3
  • 独白束2.4
编辑


config_dev.yml
中没有
monolog.handlers.main
config_dev.yml
中删除
monolog.handlers.main

它通常包含

配置\u dev.yml(默认)

独白:
处理程序:

main:#如果有人遇到这种情况,并且仍然对发生这种情况的原因感兴趣,那么调试处理程序将被注入\Symfony\Bundle\monogbundle\DependencyInjection\Compiler\DebugHandlerPass::process()方法中

class DebugHandlerPass implements CompilerPassInterface
{
    // ...

    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition('profiler')) {
            return;
        }

        if (!$container->getParameter('kernel.debug')) {
            return;
        }

        $debugHandler = new Definition('%monolog.handler.debug.class%', array(Logger::DEBUG, true));
        $container->setDefinition('monolog.handler.debug', $debugHandler);

        foreach ($this->channelPass->getChannels() as $channel) {
            $container
                ->getDefinition($channel === 'app' ? 'monolog.logger' : 'monolog.logger.'.$channel)
                ->addMethodCall('pushHandler', array(new Reference('monolog.handler.debug')));
        }
    }
}

如您所见,这会将一个新的处理程序推送到每个已注册的通道上,从而覆盖可能已添加的任何其他处理程序。

这只是隐藏了问题:Symfony、monog或其他东西正在使用日志处理程序和日志文件,我没有定义。我想知道在哪里,为什么。感谢你对一个合法答案的否决票,这将在99%的情况下帮助其他用户。。。因为
config_dev.yml
覆盖了
config.yml
中的
main
处理程序,并在dev环境中引入了日志文件
dev.log
。祝你好运解决这个问题。。。我真诚地希望没有其他人会回答。您是否尝试从
config_dev.yml
中删除带有该日志文件路径的
main
处理程序?这里隐藏的问题是什么。。。解释!我的问题是:“为什么Symfony仍然登录到dev.log文件,即使我没有在loghandler中定义它?”-我想你的答案并没有解决这个问题。与其解释为什么会发生这种情况,不如假设定义了其他处理程序。嗯:
config_dev.yml
文件中没有其他处理程序。您的建议也忽略了一个事实,即我可能希望为日志文件添加后缀。我认为否决票是合法的,正如你认为你的答案是…@Stivni我4年后刚刚读到他的答案,它为我解决了一个问题me@Edward4年后。。。那有多酷?很高兴我能帮上忙-让我开心,感谢您留下评论:)请在问题中添加
config_dev.yml
部分的
monolog
。我可以确认我在
dev
prod
配置文件中都有
monolog
但是如果我没有显式调用
app_dev.php
,则
dev
不会记录条目。所以,你遇到了一些小问题…@nifr你的建议确实非常有效@Stivni唯一认为您的配置与我的配置不同的是,我在
main
loggerI中使用了
fingers
策略,我认为他可能已经从他的
config\u dev
中删除了覆盖
main
处理程序,但没有清除他的(操作码-)缓存或类似的东西。在symfony标准中,此默认处理程序生成
logs/.log
是在
config.yml
/
config\u dev.yml
中配置的,而不是在其他地方。唯一的另一个原因可能是其他处理程序中的某个地方缺少路径,如
%kernel.logs\u dir%/%kernel.environment%.log
,这是我最初期望的建议。也许你应该把他们包括在你的回答中,我会取消我的否决票。但是:我清除了缓存,没有发现任何变化。你关于路径默认值的建议似乎更像我的经历。我会进一步调查的。如果我找到解决办法,我会告诉你的。
class DebugHandlerPass implements CompilerPassInterface
{
    // ...

    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition('profiler')) {
            return;
        }

        if (!$container->getParameter('kernel.debug')) {
            return;
        }

        $debugHandler = new Definition('%monolog.handler.debug.class%', array(Logger::DEBUG, true));
        $container->setDefinition('monolog.handler.debug', $debugHandler);

        foreach ($this->channelPass->getChannels() as $channel) {
            $container
                ->getDefinition($channel === 'app' ? 'monolog.logger' : 'monolog.logger.'.$channel)
                ->addMethodCall('pushHandler', array(new Reference('monolog.handler.debug')));
        }
    }
}