0

案例:开发环境日志级别为DEBUG,生产环境日志级别为INFO。如果环境 == 开发,我想使用每个默认日志配置并仅覆盖级别。

问题:可以覆盖第一级配置,但不能覆盖子级别。

考虑示例代码:

#file: config.rb

default = Configuration.for('default'){
  log {
    file '/tmp/foo.log'
    level 'WARN'
    freq 'daily'
  }
}

development = Configuration.for( 'development', default) {
  log {
    level 'DEBUG'
  }
}

在主文件中,我像这样使用上面的代码

# main.rb

require 'config.rb'    
$CONFIG = Configuration.for $DEV_ENV # either ('default' || 'development')
p $CONFIG.log.freq

我收到一个方法丢失错误:

`undefined method `freq' for #<Configuration:0x00000003a65d80> (NoMethodError)`

我唯一的(丑陋的)解决方案是将文件和频率值恢复为默认值,如下所示:

  log {
    file default.log.file
    level 'DEBUG'
    freq default.log.freq
  }

哎呀!讨厌!

还有其他建议吗?我也尝试使用 SettingsLogic 和 Configatron 来实现类似的东西,但无济于事。这里有 Ruby 的三个顶级配置 gem。我需要自己做吗??这真的是一个奇特的例子吗?

希望您的反馈或建议。

4

1 回答 1

0

我能够使用 YAML 中的 SettingsLogic 和锚标签解决您的问题。

我的配置文件:

defaults: &defaults
  log: &logdefault
      file:  /tmp/foo.log
      level: WARN
      freq: daily

development:
  <<: *defaults
  log:
      <<: *logdefault
      level: DEBUG

test:
  <<: *defaults

production:
  <<: *defaults

诀窍是将默认值存储在锚标签中并在您尝试重新定义它的一部分时重新使用它。每个级别都需要一个锚点。

您可以将其用作

require 'settingslogic'  #https://github.com/settingslogic/settingslogic
class SettingsDEV < Settingslogic
  source "./application.yml"
  namespace 'development'
end
p SettingsDEV.log #{"file"=>"/tmp/foo.log", "level"=>"DEBUG", "freq"=>"daily"}

class SettingsProd < Settingslogic
  source "./application.yml"
  namespace 'production'
end
p SettingsProd.log  #{"file"=>"/tmp/foo.log", "level"=>"WARN", "freq"=>"daily"}
于 2020-06-15T20:49:51.417 回答