2013-02-03 63 views
1

我有一個運行環境與Rails應用程序,Sidekiq和發條調度的目的。Sidekiq工人的不同日誌級別 - Ruby方法?

我有許多不同的工作人員,充滿了logger.debug和logger.info說明,我偶爾需要激活一些調試日誌記錄,以瞭解發生了什麼事情。 我喜歡Sidekiq記錄器,我想利用它,因爲它只需要一個「logger.debug」指令在工作人員中完成其工作。

我目前的設置錯過了爲一些工作人員激活DEBUG級別的可能性,而將其他人標準化爲INFO。

現在我的每一個工人的我有這樣的初始化方法:

class SendMailOnStart 

    include Sidekiq::Worker 
    sidekiq_options :retry => false, :queue => :critical 

    def initialize 
     logger.level = Logger::INFO 
    end 

    .... ... 

但是,如果更改了一個工人的水平,這個水平將在未來一個指定的級別被覆蓋 - 例如如果兩名工人一起處理,第二名工人將「贏」。

以優雅的方式達到此目的的最佳方法是什麼?

從Java世界的到來,我只能想創建一個自定義記錄器,並把它在每一個工人,複製由Sidekiq記錄器使用的輸出格式,增加了記錄方法在每個工人像

def logger 
    logger = MyLogger.new 
end 

和改變當我在初始化方法中使用它時的級別

這是Ruby中的最佳方法嗎?

回答

0

我不知道如果這是最好的辦法,但我會做以下。首先,讓我們準備的功能來獲取呼叫者的文件名和/或方法:

def parse_caller 
    # magic number 7 below is the amount of calls 
    # on stack to unwind to get your caller 
    if /^(?<file>.+?):(?<line>\d+)(?::in `(?<method>.*)')?/ =~ caller(7).first 
     file  = Regexp.last_match[:file] 
     line  = Regexp.last_match[:line].to_i 
     method = Regexp.last_match[:method] 
     [file, line, method] 
    end 
    end 

然後我會覆蓋默認Logger實例formatter,迫使它翻查來電:

logger.formatter = lambda do |severity, datetime, progname, msg| 
    f,l,m = parse_caller 
    # HERE GOES YOUR CHECK 
    if f =~ /…/ 
     … 
    end 
    end 

我知道它看起來很奇怪,但它對我來說工作得很好。

+0

這是一個奇怪的黑客,但這是「Sidekiq記錄器使用的複製輸出格式」的一部分,Sidekiq格式化器的複製和粘貼:-)我想知道是否有更好的方法,例如用DEBUG和另一個實例化Sidekiq記錄器一個與INFO – emas

+0

嗯......你不需要在Sidekiq格式化程序中打破。只需將級別設置爲DEBUG以查看所有文件,然後檢查是否要查看該打印並在需要時移交默認格式化程序(請參閱幾乎相同的示例@ http://www.ruby-doc.org/stdlib- 1.9.3 // libdoc /記錄器/的RDoc/Logger.html)。 – mudasobwa