Могу ли я отключить заголовок журнала для ruby ​​logger? - PullRequest
11 голосов
/ 04 ноября 2010

В настоящее время я сталкиваюсь с подобной проблемой.

Как вы, возможно, знаете, средство ведения журнала ruby ​​добавляет заголовок журнала вверху каждого вновь созданного файла журнала.

"# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]

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

Поэтому я решил просто оставить этот заголовок вне.К моему удивлению, я не нашел аргумента, который можно было бы привести при создании логгера.Я думал о чем-то вроде этого:

Logger.new "info.log", :skip_header => true

Но этого просто нет.Я искал источники в ядре ruby ​​и удивительно, что на самом деле нет ничего, что могло бы помешать регистратору добавить заголовок журнала:

def create_logfile(filename)
  logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT))
  logdev.sync = true
  add_log_header(logdev)
  logdev
end

def add_log_header(file)
  file.write(
    "# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
)
end

Кто-нибудь имеет представление, что я мог бы сделать, чтобы предотвратить заголовок журнала?Я использую Ruby 1.8.7 302 с Rails 2.3.5 здесь.Простое игнорирование комментариев на стороне хранилища невозможно, потому что я не контролирую код там, и, кажется, рискованно просто игнорировать его, если что-то пойдет не так с строкой регистрации.

Кто-тознаете регистратор, который позволяет это?Как вы думаете, было бы неплохо использовать и записать обычный файл?

Заранее спасибо, Томми

Ответы [ 3 ]

8 голосов
/ 05 ноября 2010

В идеале метод add_log_header в экземпляре Logger должен быть перезаписан, но поскольку add_log_header вызывается при инициализации, вы слишком опаздываете к тому времени, когда получите его в свои руки.Что ж, вы можете просто перезаписать метод add_log_header в классе.

class Logger::LogDevice
  def add_log_header(file)
  end
end

log1 = Logger.new('info1.log')

Но если вашему приложению после этого потребуется больше экземпляров Logger, они будут вести себя одинаково: заголовка нет.Чтобы предотвратить это:

# dismantle the header and save it under another name
class Logger::LogDevice
  alias orig_add_log_header add_log_header

  def add_log_header(file)
  end
end

# Quick,create an instance 
log1 = Logger.new('test_log1file.log')

# restore the old method:
class Logger::LogDevice  
  alias add_log_header orig_add_log_header 
end
5 голосов
/ 17 апреля 2015

Вот решение, которое включает подклассы Logger. Мы должны быть хитрыми с initialize и super, чтобы помешать ему создать стандартный Logger::LogDevice слишком рано.

class HeadlessLogger < Logger
  def initialize(logdev, shift_age = 0, shift_size = 1048576)
    super(nil) # this prevents it from initializing a LogDevice
    if logdev
      @logdev = HeadlessLogger::LogDevice.new(logdev, shift_age: shift_age, shift_size: shift_size)
    end
  end

  class LogDevice < ::Logger::LogDevice
    def add_log_header(file) ; end
  end
end
4 голосов
/ 20 октября 2015

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

FileUtils.touch logfile_path
Logger.new logfile_path

В простом Ruby вам понадобится require 'fileutils' из stdlib, очевидно.

Редактировать: Это не будет работать, если вы используете встроенную логротацию или если файл удален, так как нет перехвата при повороте, и затем он снова напишет заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...