我的问题分为两个部分
首先, 有多种方法可以创建从Logger继承的记录器(我使用ActiveSupport :: Logger)。
# 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 :(得分:0)
Autoflushing是IO
对象的属性,而不是Logger
的属性。 Logger
(通过LogDevice)在打开文件时设置f.sync = true
,因此如果您要自动刷新到自定义文件,则需要自己执行此操作:
> f = File.open('test.log', 'a')
> f.sync = true
> l = ActiveSupport::Logger.new(f)
当您删除文件时,Logger
仍然引用旧文件描述符,该文件描述符不再在磁盘上写入。如果您尝试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>