2013-02-20 18 views
2

請求的範圍內的以下工作:如何在Sinatra中訪問模型中的記錄器?

get '/' do 
    logger.info 'got /' 
    ... 

但在模型中,

class Foo 
    def bar 
    logger.info 'bar' 
    ... 

西納特拉拋出錯誤:NameError: undefined local variable or method 'logger' for main:Object

如何從模型中訪問西納特拉記錄?

+0

我總是重定向輸出和錯誤日誌文件,所以我可以只使用看跌期權來登錄...如果你真的想使用記錄器,您需要使用記錄器常量並將其放入類中,然後在要使用它的文件中要求它。 – texasbruce 2013-02-20 19:35:27

+0

您使用的是ORM嗎?其中一些例如[Sequel](http://sequel.rubyforge.org/rdoc/files/doc/cheat_sheet_rdoc.html)將允許您傳入記錄器實例。你仍然需要[按照上面給出的方式擴展範圍](http://stackoverflow.com/a/14865988/335847),類似於下面給出的一個lsu_guy。 – iain 2013-02-21 14:56:43

+0

@iain - 實際上,對於這個項目我使用的是ActiveRecord。但我對數據庫日誌不感興趣,只是我自己的日誌信息。 – 2013-02-21 16:43:02

回答

1

我相信Sinatra使用機架記錄器。從自述。 http://www.sinatrarb.com/intro.html#Logging

Sinatra will use whatever it will find in env['rack.logger'].

,您可以訪問使用記錄器ENV [ 'rack.logger']。或者你可以實現你自己的應用程序記錄器(獨立於Sinatra),因此它可以單獨保存你的.log文件,並與你的設置(嚴重級別,日誌旋轉等)保存在一起。這是一個簡單的例子。

module App 
    extend self 
    attr_accessor :log 

    # init 
    self.log = Logger.new('log/application.log', 10, 5242880) 
    self.log.level = Logger::DEBUG # could DEBUG, ERROR, FATAL, INFO, UNKNOWN, WARN 

    self.log.formatter = proc { |severity, datetime, progname, msg| 
           "#{severity} :: #{datetime.strftime('%Y-%m-%d :: %H:%M:%S')} :: #{progname} :: #{msg}\n" 
end 
從你的類

然後,使用下列之一:

App.log.debug "some debug msg" 
App.log.info "some info msg" 
App.log.error "some error msg" 
+1

請注意,如果您希望代碼示例正常工作,您需要'require'logger''。 – 2014-01-07 08:59:43

相關問題