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