Ruby 如何从Sinatra中的模型访问记录器?

Ruby 如何从Sinatra中的模型访问记录器?,ruby,logging,sinatra,Ruby,Logging,Sinatra,以下内容在请求上下文中起作用: get '/' do logger.info 'got /' ... 但在一个模型中 class Foo def bar logger.info 'bar' ... Sinatra抛出错误:NameError:main:Object的未定义局部变量或方法“logger” 如何从模型内访问Sinatra记录器?我相信Sinatra使用机架记录器。自述 Sinatra将使用它在env['rack.logger']中找到的任何东西 您可以

以下内容在请求上下文中起作用:

get '/' do
  logger.info 'got /'
  ...
但在一个模型中

class Foo
  def bar
    logger.info 'bar'
    ...
Sinatra抛出错误:
NameError:main:Object的未定义局部变量或方法“logger”


如何从模型内访问Sinatra记录器?

我相信Sinatra使用机架记录器。自述

Sinatra将使用它在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"

我总是将stdout和stderr重定向到一个日志文件,这样我就可以使用put来记录。。。如果你真的想使用一个记录器,你需要使用一个记录器常量并将其放入一个类中,然后在你想要使用它的文件中要求它。你使用的是ORM吗?其中一些,例如,将允许您传入记录器实例。你仍然需要这样做,就像lsu的家伙在下面给出的一样。@iain-实际上,对于这个项目,我使用的是ActiveRecord。但我对数据库日志不感兴趣,只对我自己的日志信息感兴趣。@bseen-让我们知道你最终会做什么。很想知道。@lsu_盖-谢谢你的回答。我还没试过。与其通过创建模块来增加复杂性,我可能只声明一个全局变量并将其设置为env['rack.logger']。谢谢你告诉我怎么做。请注意,如果你想让代码示例正常工作,你需要
要求“logger”