0

ケース:本番環境がINFOであるのに対し、開発環境のログレベルはDEBUGです。すべてのデフォルトのログ構成を使用し、environment==develomentの場合にのみレベルを上書きしたいと思います。

問題:第1レベルの構成は上書きできますが、サブレベルは上書きできません。

サンプルコードを検討してください。

#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
  }

EEWWW !! 不快な!

他に何か提案はありますか?私はSettingsLogicとConfigatronを使ってこのようなものを実装しようとしましたが無駄になりました。Rubyの上位3つの構成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 に答える