登录Sinatra?

Kyl*_*Fox 53 ruby logging rack sinatra

我无法弄清楚如何使用Sinatra记录消息.我不打算记录请求,而是在我的应用程序中的某些点上自定义消息.例如,在获取我想要记录的URL时"Fetching #{url}".

这是我想要的:

  • 指定日志级别的能力(例如:logger.info("Fetching #{url}"))
  • 在开发和测试环境中,消息将写入控制台.
  • 在生产中,只写出与当前日志级别匹配的消息.

我猜这可以很容易地在做config.ru,但我不是100%肯定,我想启用该设置,如果我必须手动创建一个Logger对象本人(以及此外,该级Logger使用方法:Logger,Rack::Logger,或Rack::CommonLogger) .

(我知道在StackOverflow上有类似的问题,但似乎都没有直接回答我的问题.如果你能指出我现有的问题,我会把这个问题标记为副本).

Kon*_*ase 46

Sinatra 1.3将附带一个这样的记录器对象,完全可以像上面一样使用.您可以使用" 流出边缘 "中所述的边缘Sinatra .我想,在我们发布1.3之前不会那么久.

要与Sinatra 1.2一起使用,请执行以下操作:

require 'sinatra'
use Rack::Logger

helpers do
  def logger
    request.logger
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 用法在github上的Sinatra README中描述:`logger.info("foo")`.目的地由Web服务器设置(它使用Rack错误流),您基本上可以通过更改`env ['rack.errors']`来设置它. (10认同)
  • 如果您包含有关如何设置记录器目标(文件/ STDOUT)以及如何实际记录(`logger.info"foo"`?)的信息,这个答案将会非常有用. (9认同)
  • 因为使用帮助器,这似乎只在请求上下文中工作.它不适用于应用程序早期部分发生的事情(预先请求,应用程序设置等) (2认同)

Phr*_*ogz 16

我个人通过以下方式登录Sinatra:

require 'sinatra'
require 'sequel'
require 'logger'
class MyApp < Sinatra::Application
  configure :production do
    set :haml, { :ugly=>true }
    set :clean_trace, true

    Dir.mkdir('logs') unless File.exist?('logs')

    $logger = Logger.new('logs/common.log','weekly')
    $logger.level = Logger::WARN

    # Spit stdout and stderr to a file during production
    # in case something goes wrong
    $stdout.reopen("logs/output.log", "w")
    $stdout.sync = true
    $stderr.reopen($stdout)
  end

  configure :development do
    $logger = Logger.new(STDOUT)
  end
end

# Log all DB commands that take more than 0.2s
DB = Sequel.postgres 'mydb', user:'dbuser', password:'dbpass', host:'localhost'
DB << "SET CLIENT_ENCODING TO 'UTF8';"
DB.loggers << $logger if $logger
DB.log_warn_duration = 0.2
Run Code Online (Sandbox Code Playgroud)

  • 为什么一方面使用模块化应用程序而使用全局变量来存储记录器? (8认同)

lfe*_*445 7

如果您正在使用像独角兽日志记录或其他中间件那样的IO流,那么您可以轻松地将记录器设置为STDOUT或STDERR

# unicorn.rb
stderr_path "#{app_root}/shared/log/unicorn.stderr.log"
stdout_path "#{app_root}/shared/log/unicorn.stdout.log"

# sinatra_app.rb
set :logger, Logger.new(STDOUT) # STDOUT & STDERR is captured by unicorn
logger.info('some info') # also accessible as App.settings.logger
Run Code Online (Sandbox Code Playgroud)

这允许您拦截应用程序范围内的消息,而不是仅仅作为请求帮助程序访问logger