Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 登录Sinatra?_Ruby_Logging_Sinatra_Rack - Fatal编程技术网

Ruby 登录Sinatra?

Ruby 登录Sinatra?,ruby,logging,sinatra,rack,Ruby,Logging,Sinatra,Rack,我不知道如何用Sinatra记录消息。我不想记录请求,而是想在我的应用程序的某些点上定制消息。例如,在获取URL时,我想记录“获取#{URL}” 以下是我想要的: 能够指定日志级别(例如:logger.info(“Fetching{url}”)) 在开发和测试环境中,消息将被写入控制台 在生产中,仅写出与当前日志级别匹配的消息 我猜这可以在config.ru中轻松完成,但我不能100%确定要启用哪个设置,以及是否必须自己手动创建Logger对象(此外,还要使用哪类Logger,Rack::L

我不知道如何用Sinatra记录消息。我不想记录请求,而是想在我的应用程序的某些点上定制消息。例如,在获取URL时,我想记录
“获取#{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的。这正是我打算让它做的,这样您就可以调试那些基于请求的错误,并在一个地方查看所有日志。假设这就是目标,这种方法有什么不安全的地方吗?这对我很有效。