2010-11-04 21 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鉤子,它會再次寫入標頭。