动态更改Ruby Logger的LogDevice

时间:2012-04-02 06:35:20

标签: ruby logging

是否可以动态更改Ruby LogDevice的{​​{1}}?

如果是这样,它将允许对我现有的代码库进行一些不显眼的更改。

目前,Ruby Logger使用Logger作为StringIO

LogDevice

可以动态更改@logDevice = StringIO.new("", "r+") @log = Logger.new(@logDevice) // a reference to this is used by many objects // both are instance vars ... @log.info('some log') // Logging activity ... // Before program ends, transmit logs to a server 以继续记录到文件吗? (动态变化,因为最初的文件名是未知的。)

如果无法更改日志设备,LogDevice对象是否可以开始写入文件?

我可以写一个临时的日志文件而不是上面的内容,但是想检查是否可以完成上述操作,因为这对现有的代码库来说是一个不那么突兀的改动。

1 个答案:

答案 0 :(得分:1)

您给记录器的对象只需要实现'write'和'close'方法,这样您就可以轻松编写自己的'io':

class MyIO
  def initialize
    @file = nil
    @history = StringIO.new "", "w"
  end

  def file=(filename)
    @file = File.open(filename, 'a+')
    @file.write @history.string if @history
    @history = nil
  end

  def write(data)
    @history.write(data) if @history
    @file.write(data) if @file
  end

  def close
    @file.close if @file
  end

使用该实例创建记录器并保留对该实例的引用。然后,只要知道文件名,只需使用'file ='方法设置它。