7

明らかな何かが本当に欠けているに違いありませんが、RubyアプリケーションでのLog4rの一般的な使用に問題があります。問題なくログに記録できますが、セットアップ方法ではオーバーヘッドが不格好に見えます。基本的に、ファイル名へのフルパスを渡して、アプリケーションの各クラスにログインします。呼び出されるrubyスクリプトは、ARGVの引数の1つからログファイルをプルします。このログファイルは、rubyで呼び出す各クラスに渡されて設定されます。各クラスで、patternFormatterを使用して、クラス/ファイル名をログステートメントに挿入します。

これを機能させるためのより良い方法はありますか?私が何を考えても、rubyアプリケーションの各クラスに何かを渡す必要があるように感じます。代わりに、ログファイルをyaml構成ファイルに設定することもできますが、その場合は、構成ファイルを各クラスにも渡します。

何かアドバイス?これが意味をなさない場合は、より具体的なコードサンプルを投稿して、私が何を意味するのかをさらに説明することができます。

ありがとう!

4

2 に答える 2

14

私はlog4rのメンテナーです。

個々のスクリプト(異なる.rbファイル)の場合、いくつかの異なる方法でこれにアプローチできます(フィッティング、私は知っています)。最初に、ここでカバーしている機能が>=1.1.4で利用可能であることに注意してください。

1つの方法は、スクリプトごとに異なるPatternFormatter文字列を設定することです(yamlまたはxml構成ファイルを作成する場合は、クラス名ごとに異なるパターンを指定できます)。

もう1つの方法は、PatternFormatterでGDC、NDC、またはMDCのいずれかを使用することです。

GDCは「グローバル診断コンテキスト」を設定します。つまり、スクリプトを実行しているすべてのスレッドから利用できる値です。パターンに%gを入れ、GDC.set(String)を介して値を設定することで使用できます。詳細については、http://log4r.rubyforge.org/manual.htmlを参照してください

NDCとMDCは、それぞれネストされた診断コンテキストとマップされた診断コンテキストです。これらのパターンは、%xと%X {Symbol | Object}を使用し、NDC.set(String)とMDC.put(Symbol | Object、Object)を介して設定することです。

さらに別の方法は、呼び出しが行われた場所のファイル名と行番号を出力するパターン%tを使用することです。

これらの各方法のトレードオフは、CPUリソースの使用が次第に高くなることです。私はあなたが求めているようなもののために最初にGDCを使う傾向があります。

于 2010-12-28T21:30:10.657 に答える
12

Log4r::Loggerうーん、スクリプトの最初にクラスをインスタンス化せず、インスタンスを渡さない理由は何ですか?あなたはそれを渡す必要さえありません、あなたはいつでもLoggerクラスから名前でそれを得ることができます:

run.rb:

require 'log4r'
require 'class_a'

logger = Log4r::Logger.new('test')
logger.outputters << Log4r::Outputter.stdout
logger.outputters << Log4r::FileOutputter.new('logtest', :filename =>  'logtest.log')
logger.info('started script')
a = A.new
a.do_something
logger.info('finishing')

class_a.rb:

class A
  def do_something
    logger = Log4r::Logger['test']
    logger.info('in do_something')
    puts 'hi!'
  end
end

実行run.rbすると、次のようになります。

$ ruby run.rb 
 INFO test: started script
 INFO test: in do_something
hi!
 INFO test: finishing

logtest.logおよびディスク上に名前が付けられたログファイル。

于 2010-03-18T19:54:50.873 に答える