Ruby 登录Sinatra?
我不知道如何用Sinatra记录消息。我不想记录请求,而是想在我的应用程序的某些点上定制消息。例如,在获取URL时,我想记录Ruby 登录Sinatra?,ruby,logging,sinatra,rack,Ruby,Logging,Sinatra,Rack,我不知道如何用Sinatra记录消息。我不想记录请求,而是想在我的应用程序的某些点上定制消息。例如,在获取URL时,我想记录“获取#{URL}” 以下是我想要的: 能够指定日志级别(例如:logger.info(“Fetching{url}”)) 在开发和测试环境中,消息将被写入控制台 在生产中,仅写出与当前日志级别匹配的消息 我猜这可以在config.ru中轻松完成,但我不能100%确定要启用哪个设置,以及是否必须自己手动创建Logger对象(此外,还要使用哪类Logger,Rack::L
“获取#{URL}”
以下是我想要的:
- 能够指定日志级别(例如:
)logger.info(“Fetching{url}”)
- 在开发和测试环境中,消息将被写入控制台
- 在生产中,仅写出与当前日志级别匹配的消息
config.ru
中轻松完成,但我不能100%确定要启用哪个设置,以及是否必须自己手动创建Logger
对象(此外,还要使用哪类Logger
,Rack::Logger
,或Rack::CommonLogger
)
(我知道在StackOverflow上也有类似的问题,但似乎没有一个能直接回答我的问题。如果你能给我指出一个现有的问题,我将把这个问题标记为一个重复的问题)。Sinatra 1.3将附带这样一个记录器对象,完全可以如上所述使用。您可以使用edge Sinatra,如“”中所述。我想在发布1.3之前不会太久 要与Sinatra 1.2一起使用,请执行以下操作:
require 'sinatra'
use Rack::Logger
helpers do
def logger
request.logger
end
end
我个人通过以下方式登录Sinatra:
需要“sinatra”
需要“续集”
需要“记录器”
类MyApptrue}
设置:清除跟踪,真
Dir.mkdir('logs'),除非File.exist?('logs'))
$logger=logger.new('logs/common.log','weekly')
$logger.level=记录器::警告
#在生产期间将stdout和stderr吐到文件中
#万一出了问题
$stdout.reopen(“logs/output.log”,“w”)
$stdout.sync=true
$stderr.重新打开($stdout)
结束
配置:开发吗
$logger=logger.new(标准输出)
结束
结束
#记录占用时间超过0.2秒的所有DB命令
DB=Sequel.postgres'mydb',用户:'dbuser',密码:'dbpass',主机:'localhost'
DB下面是另一个解决方案:
module MySinatraAppLogger
extend ActiveSupport::Concern
class << self
def logger_instance
@logger_instance ||= ::Logger.new(log_file).tap do |logger|
::Logger.class_eval { alias :write :'<<' }
logger.level = ::Logger::INFO
end
end
def log_file
@log_file ||= File.new("#{MySinatraApp.settings.root}/log/#{MySinatraApp.settings.environment}.log", 'a+').tap do |log_file|
log_file.sync = true
end
end
end
included do
configure do
enable :logging
use Rack::CommonLogger, MySinatraAppLogger.logger_instance
end
before { env["rack.errors"] = MySinatraAppLogger.log_file }
end
def logger
MySinatraAppLogger.logger_instance
end
end
class MySinatraApp < Sinatra::Base
include MySinatraAppLogger
get '/' do
logger.info params.inspect
end
end
模块mysinatraapploger
扩展ActiveSupport::关注点
类如果您正在使用类似于unicorn日志记录或其他跟踪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
这允许您在应用程序范围内截获消息,而不仅仅是作为请求帮助程序访问记录器如果您包含有关如何设置记录器目标(文件/STDOUT)以及如何实际记录的信息(logger.info“foo”
?),此答案将非常有用github上的Sinatra自述文件中描述了用法:logger.info(“foo”)
。目的地由Web服务器设置(它使用机架错误流),您基本上可以通过更改env['Rack.errors']
来设置它。由于使用了帮助程序,这似乎只在请求上下文中起作用。它不适用于应用程序早期发生的事情(预请求、应用程序设置等),但我必须首先使用设置变量,即:settings.logger.info('blablablabla')为什么一方面使用模块化应用程序,而另一方面使用全局变量来存储记录器?@Konstantin问得好。我对simple config.ru MyApp.run使用前者,但我从未在同一个进程中运行多个应用程序,因此到目前为止,丑陋的全局变量只是方便的惰性。重新打开STDOUT可能会使乘客无法启动:Rack::Logger
流到env['Rack.errors']
,在before过滤器中覆盖它的内容似乎是个坏主意,我不知道为什么这会使它成为一个坏主意。你能提供更多的细节吗?固定链接:我的想法是,这把钥匙是由机架记录器内部保留的,用于跟踪基于请求的错误,这是正确的。如果我理解正确,这意味着您不仅重定向了自己的日志语句,还重定向了Rack的。这正是我打算让它做的,这样您就可以调试那些基于请求的错误,并在一个地方查看所有日志。假设这就是目标,这种方法有什么不安全的地方吗?这对我很有效。