Ruby记录器追加模式

时间:2016-04-19 13:58:58

标签: ruby-on-rails ruby logging activesupport

我的问题分为两个部分

首先, 有多种方法可以创建从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是如何做到的?任何线索?

1 个答案:

答案 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>