Динамически изменить LogDevice Ruby Logger - PullRequest
1 голос
/ 02 апреля 2012

Возможно ли динамически изменить LogDevice Ruby Logger?

Если это так, это позволило бы внести некоторые ненавязчивые изменения в мою существующую кодовую базу.

Текущий RubyLogger использует 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 для продолжения записи в файл?(динамическое изменение, поскольку изначально имя файла неизвестно.)

Или, если устройство журнала не может быть изменено, может ли объект StringIO начать запись в файл?

Вместо того, чтобы выполнить вышеизложенное, ямог записывать во временный файл журнала, но хотел проверить, можно ли выполнить вышеперечисленное, потому что это будет менее навязчивым изменением существующей кодовой базы.

1 Ответ

1 голос
/ 02 апреля 2012

Объект, который вы передаете регистратору, просто должен реализовать методы 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

end

создать регистратор с экземпляром этого и сохранить ссылку на экземпляр.Затем, когда вы знаете имя файла, просто установите его с помощью метода 'file ='.

...