【问题标题】:How to access logger from model in Sinatra?如何从 Sinatra 中的模型访问记录器?
【发布时间】:2013-02-20 19:11:50
【问题描述】:

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

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

但在模型中,

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

Sinatra 抛出错误:NameError: undefined local variable or method 'logger' for main:Object

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

【问题讨论】:

  • 我总是将 stdout 和 stderr 重定向到一个日志文件,这样我就可以使用 puts 来记录...如果你真的想使用一个记录器,你需要使用一个记录器常量并将它放在一个类,然后在要使用的文件中要求它。
  • 你在使用 ORM 吗?其中一些,比如Sequel,会让你传入一个记录器实例。你仍然需要expand the scope to access it the way you've given above,与下面 lsu_guy 给出的方式类似。
  • @iain - 实际上,对于这个项目,我正在使用 ActiveRecord。但我对数据库日志不感兴趣,只对我自己的日志信息感兴趣。
  • @BSeven - 让我们知道你最终做了什么。很想知道。
  • @lsu_guy - 感谢您的回答。我还没试过。与其通过创建模块来增加复杂性,我可能只会声明一个全局并将其设置为 env['rack.logger']。感谢您告诉我该怎么做。

标签: ruby logging sinatra


【解决方案1】:

我相信 Sinatra 使用机架式记录器。来自自述文件。 http://www.sinatrarb.com/intro.html#Logging

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"

【讨论】:

  • 请注意,如果您希望该代码示例正常工作,您需要require 'logger'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2020-02-24
相关资源
最近更新 更多