2010-11-04 19 views
8

我目前遇到种种问题。我可以禁用红宝石记录器的日志标头吗?

正如您所知,ruby logger在每个新创建的日志文件的顶部添加了一个日志记录标头。

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

我记录的CSV文件后导入他们在仓库里,平时我就跳过与标题的第一行。看起来好像记录器中存在一个错误,因为有时记录标题会在日志文件的中间出现多次。

所以我决定把这个标题留下。令我惊讶的是,我没有发现在创建记录器时可以通过的任何论点。我想到了这样的事情:

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

但它只是不存在。我搜索的红宝石核心来源,令人惊讶真的有什么,可以防止从将日志头记录器:

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。简单地忽略仓库端的评论是不可能的,因为我无法控制那里的代码,如果一个日志记录行发生错误,那么简单地忽略它就会有风险。

有人知道一个记录器,允许这?你认为这是一个好主意,使用和写入纯文件?

由于提前, 汤米

回答

7

理想的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') 

但是,如果您的应用程序在此之后需要更多的记录器实例,它们将表现相同:无标题。为了防止这种情况发生:

# 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 
+0

太好了,谢谢!没有想到“猴子补丁”记录器,因为它被认为是肮脏的。但是对于以前和以后的调用,没有任何变化。大! – 2010-11-08 09:27:34

2

下面是涉及子类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 
2

作为替代修补记录器类,根本不让它通过前期接触它创建日志文件:

FileUtils.touch logfile_path 
Logger.new logfile_path 

在纯Ruby中,你将需要require 'fileutils'从STDLIB明显。

编辑:如果您使用内置的logrotation或者文件被删除,这将不起作用,因为没有on-rotate钩子,它会再次写入标头。