我可以禁用ruby logger的日志头吗?

Tho*_*ser 11 ruby logging header

我目前遇到了一个问题.

您可能知道,ruby logger在每个新创建的日志文件的顶部添加了一个日志标头.

"# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
Run Code Online (Sandbox Code Playgroud)

我正在记录CSV文件以便稍后在仓库中导入它们,通常我只是跳过带标题的第一行.似乎记录器中存在错误,因为有时日志记录标题会出现在日志文件的中间.

所以我决定简单地把那个标题留下来.令我惊讶的是,我没有发现在创建记录器时可以传递的任何争论.我想到了这样的事情:

Logger.new "info.log", :skip_header => true
Run Code Online (Sandbox Code Playgroud)

但它不存在.我搜索了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
Run Code Online (Sandbox Code Playgroud)

有没有人知道我能做什么,以防止日志标题?我在这里使用Ruby 1.8.7 302和Rails 2.3.5.简单地忽略仓库方面的评论是不可能的,因为我无法控制那里的代码,如果日志行出现问题,那么忽略它似乎是冒险的.

有人知道一个允许这个的记录器吗?你认为在文件中使用和写明文是个好主意吗?

先谢谢你,汤米

ste*_*lag 8

理想的情况是在Logger实例的方法add_log_header应该被覆盖,但由于add_log_header叫上初始化,你来得太晚了由你得到你的手放在它的时间.好吧,你可以覆盖Class上的add_log_header方法.

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

log1 = Logger.new('info1.log')
Run Code Online (Sandbox Code Playgroud)

但是,如果您的应用在此之后需要更多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
Run Code Online (Sandbox Code Playgroud)


dev*_*ppy 5

这是一个涉及子类化的解决方案Logger.我们必须偷偷摸摸与initializesuper保持它从创建一个标准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
Run Code Online (Sandbox Code Playgroud)