如何让 Doctrine 在 Symfony2 中记录查询

Posted

技术标签:

【中文标题】如何让 Doctrine 在 Symfony2 中记录查询【英文标题】:How to get Doctrine to log queries in Symfony2 【发布时间】:2015-06-10 19:39:32 【问题描述】:

我是 Symfony2 的新手,我正在寻找一种将 SQL 查询(包括计时)记录到与我的应用程序其余部分相同的日志文件的方法。

根据我从文档中可以确定的内容,这一切都应该开箱即用,但经过几个小时的尝试,我无法弄清楚我做错了什么。

config_dev.yml

monolog:
    handlers:
        doctrine:
            action_level: debug
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%_doctrine.log
            channels: doctrine

config.yml

# Doctrine Configuration
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        logging:  true
        profiling:  true

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        auto_mapping: true

我根本没有生成任何日志文件。我的其他日志处理程序工作正常(此处未列出)。

我想知道我在哪里出错了,而且这是否真的是正确的方法,或者我是否应该实现一个实现 SQL Logger 的新类,如下所述:http://vvv.tobiassjosten.net/symfony/logging-doctrine-queries-in-symfony2/

但我不知道如何通过配置/服务将其插入以使其适用于项目范围(例如,我不想在每个控制器中调用它)。

非常感谢您的帮助!

【问题讨论】:

在 dev 中这是由 symfony 自动完成的。在生产中,不建议这样做,因为它是一个缓慢的过程。 @Stev - 当你说“慢”时,你有什么指标可以支持吗?我认为记录数据库查询对于分析性能缓慢的站点和繁重的数据库负载是绝对必要的,我听说这说明了很多关于记录速度慢的问题。我的假设是我们在这里谈论的是微秒,而不是毫秒或几十毫秒? 我个人没有指标,但文件写入被认为是一个缓慢的操作。而且随着文件大小的增加,它会变得更慢,即使您使用旋转系统(如操作系统日志记录)构建,您仍然会影响您的应用程序性能。根据我的经验,我选择使用像 newrelic.com 这样的工具来监控慢查询。 mysql 还有一个配置(但我确信任何数据库引擎都有一个)来记录慢查询(你可以选择慢对你意味着什么,比如>50ms 很慢)dev.mysql.com/doc/refman/5.1/en/slow-query-log.html 【参考方案1】:

如果您确实确定需要在生产中记录学说 2 查询,那么您可以在学说的配置中进行设置。

connections:
        # A collection of different named connections (e.g. default, conn2, etc)
        default:
                # when true, queries are logged to a "doctrine" monolog channel
            logging: true 

http://symfony.com/doc/current/reference/configuration/doctrine.html

并配置独白以记录教义,如文档中所述: http://symfony.com/doc/current/cookbook/logging/channels_handlers.html

可以在symfony 2.4 can't get the doctrine channel in prod environment找到类似的问题

【讨论】:

太棒了-谢谢。我完全错过了为什么这不起作用(基本上在另一个配置文件中有一个覆盖),但这绝对是正确的答案。 这个问题来自 2015 年和 Symfony 2。当然,答案在 Symfony 5 上不适用于 2020 年。但解决方案很简单。请参阅教义 -> dbal 下的“日志记录”键,您可以将其设置为 true 以始终启用日志记录。 symfony.com/doc/current/reference/configuration/doctrine.html【参考方案2】:

完整的配置示例:

config/packages/dev/doctrine.yaml:

doctrine:
    dbal:
        connections:
            default:
                logging: true

如果你还没有独白,安装它:composer require symfony/monolog-bundle,你应该开始在日志文件中获取所有 SQL 查询:var/log/dev.log

【讨论】:

以上是关于如何让 Doctrine 在 Symfony2 中记录查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Doctrine2 (Symfony2) 中按案例排序

在 Symfony2 中使用 Doctrine 映射异常错误

如何使用 Doctrine 在 Symfony2 中实现子查询?

Symfony2/Doctrine:如何使用 OneToMany 将实体重新保存为级联新行

如何在 Symfony2,学说 2 中使用 @SqlResultSetMapping?

Symfony2 在 Doctrine Fixtures Load 中执行 SQL 文件