symfony2 yaml:覆盖配置

Sgo*_*kes 6 yaml symfony

我无法让symfony2配置正确覆盖其他配置文件中的值.这是问题所在:

我有一个新的环境"staging"我想要使用来自config_prod.yml的大部分内容但是有另一个日志记录级别(我希望它在开发中,只需将所有内容记录到文件中).这是我使用的配置内容:

config_prod.yml:

imports:
    - { resource: config.yml }

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            handler: nested
        nested:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
Run Code Online (Sandbox Code Playgroud)

config_staging.yml:

imports:
    - { resource: config_prod.yml }

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
        nested: ~
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,嵌套记录器现在为null,主记录到给定文件.真正发生的是他将每条消息记录两次!当我将它用于config_staging.yml时也会发生同样的情况:

imports:
    - { resource: config_prod.yml }

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            handler: ~
        nested: ~
Run Code Online (Sandbox Code Playgroud)

我找到了一个解决方法,将主处理程序的action_level设置为debug并将其他所有内容保留原样,但我不喜欢这个解决方案.必须有一种方法来覆盖配置的东西,所以我只有主要的monolog处理程序.

Sgo*_*kes 9

差不多一年后,我现在了解发生了什么以及如何防止它:

nested处理程序是befilled与来自配置config.yml和解析时config_staging.yml,该YAML部件不会覆盖整个HashMap和设置为空值,但尝试合并两者,如前面产生的同一阵列英寸

有一种类型null可以用来覆盖任何Logger.它没有任何作用,因此适用于此用例:

monolog:
    handlers:
        main:
            type: stream
            path: %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            handler: ~
        nested: ~
            type: null
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是不配置config.yml中的任何日志记录,而只是在特定环境配置中config_prod.yml等等.