2016-04-19 5 views
1

私の質問は、まず、ロガーを作成するには、複数の方法があります ロガーから継承する(私はactivesupportの::ロガーを使用して)2節 Rubyのロガーは

に分割されたモードを追加します。

# Approach 1 
logger = ActiveSupport::Logger.new('test.log') 
logger.info "Test1" # => I see the auto flushing happens in this 

# Approach 2 
logger = ActiveSupport::Logger.new(File.new('test.log','a')) 
logger.info "Test2" ## No auto flushing unless done logger.close 

このように、アプローチ2のポイントは表示されません。自動フラッシングは発生しません。

アプローチ2で自動フラッシュが行われないのはなぜですか?第二に

私は私のログファイル上記のアプローチのどれも削除しないに起こる場合(上記の言及は)二度と新しいログファイルを作成しても、ログメッセージをログに記録しません。

このような状況ではどうすればよいですか? Railsはどうしていますか?どんな手掛かり?

答えて

0

自動フラッシュはIOオブジェクトのプロパティであり、Loggerではありません。ファイルを削除すると

> f = File.open('test.log', 'a') 
> f.sync = true 
> l = ActiveSupport::Logger.new(f) 

Loggerはまだ参照を持っている:それは、ファイルを開いたときにカスタムファイルに自動フラッシュする場合、あなたが自分で行う必要があるので、(LogDevice経由)Loggerは、f.sync = trueを設定し、古いファイルディスクリプタに書き込まれます。古いディスクリプタは、もはや書き込むディスク上の場所を持ちません。あなたはlstatにそれをしようとすると、エラーが表示されます:

> f.lstat 
Errno::ENOENT: No such file or directory @ rb_file_lstat - test.log 

これを気付いた場合、あなたはreopen可能なディスク上に新しいファイルを取得するために:私は実際にした第一のポイントのために合意

> f.reopen('test.log', 'a') 
> f.lstat 
#<File::Stat dev=0x1000002, ino=22095609, mode=0100644, nlink=1, uid=501, gid=20, rdev=0x0, size=0, blksize=4096, blocks=0, atime=2016-04-19 08:09:45 -0700, mtime=2016-04-19 08:09:44 -0700, ctime=2016-04-19 08:09:44 -0700, birthtime=2016-04-19 08:09:44 -0700> 
+0

を'file'オブジェクトを引数として与えるたびにloggerが私のためにそれを行うと仮定します(' sync ')。 2番目の部分で合意しました。それは、それが依然として参照を保持するファイルを削除するときです。私が望んでいたのは、最後の部分からのものでした。ファイルのログを有効にする方法は、基本的にコードを少し変更することなく新しいファイルを書き込むことでした。 – Viren

+0

@Krisjan 'lstat'はそれに感謝しました。 – Viren