我們有代碼在我們的Ruby 1.8.6 web應用程序中記錄數據。你大致這樣稱呼它:在Ruby中調用者模塊
$log.info("Some text here")
現在,在記錄的輸出中,我想包括該行出現的模塊。我知道Kernel#caller
會給我一個數組,在那裏我可以取出日誌行發生的文件和行號,但我不想那樣。我想要這個模塊,而不是文件名。顯而易見的解決方案是修改日誌行,使其如下所示:
$log.info("Some text here", self.class.name)
然後解析結果。但是,這並不奏效,因爲我試圖在默認情況下提取這些信息。也就是說,如果程序員忘記指定模塊,即日誌行的第二個參數,我需要解決方案才能工作。
有沒有辦法做到這一點?如果不是的話,我只需要與caller
陣列合作;我們大多數模塊都在不同的目錄中,所以這將是一個80%的解決方案。在文件foo.rb
module Log
class Logger
def info(msg, mod = '')
puts "Module: #{mod} Msg: #{msg}"
end
end # class Logger
end # module Log
$log = Log::Logger.new
:在文件log.rb
:
更完整的示例,請原諒小的語法錯誤
module Foo
class Bar
def do_something
# Do not pass in self.class.name.
# We want the output to look like:
# Module: Foo Msg: I did something!
$log.info "I did something!"
end
end # class Bar
end #module Foo
我看不出如何做到這一點,除非將'self'或'binding'傳遞給記錄器對象。你必須用來自'caller'的信息解析文件,我相信你不想這樣做。 – 2010-01-07 18:33:14