1

我正在尝试在我的简单经典风格的 sinatra 应用程序中设置日志记录。(v1.3.2) 我在 environment.rb 文件中定义了所有设置,如下所示:

require 'sinatra'
require 'couchrest'
require 'couchrest_model'
require 'json'
require "net/http"
require "uri"
require 'shotgun'  # to auto-restart server on page reload

enable :run, :logging

# CouchDB setup
configure do
  SiteConfig = OpenStruct.new(
                              :url_base => 'http://localhost:4567/',
                              :url_base_db => 'http://localhost:5984/',
                              :db_name => 'adrequest'
                              )
end

# Logging setup
logger = Logger.new('vehicle.log')
use Rack::CommonLogger, logger

我的应用程序文件如下所示:

require './environment'

class Vehicle < CouchRest::Model::Base
  use_database CouchRest.database!((SiteConfig.url_base_db || '') + SiteConfig.db_name)

  property :url, String
  timestamps!

  validates_presence_of :url
end

get '/*' do

  requesturl = params[:splat].first

  @vehicle = Vehicle.new
  @vehicle.url = requesturl
  @vehicle.save
  puts "logger: #{env['rack.logger']}"
  puts "env: #{ENV['RACK_ENV']}"
  logger.info "written to DB"
end

not_found do
  halt 404, 'page not found'
end

结果是:

logger: #<Rack::NullLogger:0x007fb4f4ccc238>
env: development

该应用程序创建了一个“vehicle.log”文件,但它是空的。如何让 logger.info 写入我的“vehicle.log”文件?

我在这里阅读了 Sinatra README:http ://www.sinatrarb.com/intro#Logging 。这似乎暗示我所需要的只是:

enable :logging

然后 sinatra 将从 Rack::CommonLogger 获取其余配置,但它没有说明如何准确地做到这一点......

提前感谢您的任何想法!

4

1 回答 1

0

“记录器”永远不会在应用程序文件中启用的原因是因为它在 environment.rb 文件中具有本地范围。通常,在文件中定义的 Ruby 变量在该文件中是本地范围的。

我对此的解决方案是使“记录器”变量成为全局变量:

$logger = Logger.new('vehicle.log')

虽然全局变量的使用通常不受欢迎,但这个应用程序足够简单,可能没问题。尽管如此,如果应用程序变得更大,那么查看更多基于模块的应用程序并以不同的方式处理配置可能会有意义。(也许使用模块或 configu.ru 文件?)

我不确定这是否是“理想”的解决方案,所以如果有人有更好的想法,请发表评论。

顺便说一句,在 environment.rb 文件中定义的 SiteConfig 变量原来是一个常量(您可以通过 do 看到这一点puts "SiteConfig: #{defined? SiteConfig}"),这就是为什么它的值可以在单独的应用程序文件中“看到”的原因。

于 2012-06-02T19:50:16.383 回答