案例:开发环境日志级别是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的顶级配置宝石。我需要自己做吗??这真的是一个异国情调的例子吗?
希望得到您的反馈或建议。
发布于 2020-06-16 04:49:51
我解决了你在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"}https://stackoverflow.com/questions/14206046
复制相似问题