我的Sinatra API应用程序是否需要类声明?

时间:2018-12-31 20:21:11

标签: ruby nginx logging sinatra

有人为我开发了一个运行良好的API应用程序。不幸的是,它不会在任何地方记录日志,也根本没有日志。该应用程序使用“ rackup”命令运行,位于nginx Web服务器后面。 Sinatra错误不会记录到Nginx日志中。

app.rb文件看起来像这样:

require './libs'
require 'sinatra'
require 'sinatra/namespace'

set :bind, '::1'

before do
  content_type :json
  headers 'Access-Control-Allow-Origin' => '*',  'Access-Control-Allow-Methods' => ['OPTIONS', 'GET', 'POST']
end

namespace '/api/v1' do
  namespace '/getit/:thingtoget' do
    helpers do
      def myhelper1
        <stuff>
      end
      def myhelper1
        <stuff>
      end
   end

   before do
     myhelper1
     myhelper2
   end

   get '/info' do
     WidgetDomain::get_info(@va1, @var2).to_json
   end

   <more API paths here>

 end

现在一切正常。但是现在我要介绍日志记录。因此,我查看了Sinatra自述文件,它说我可以启用日志记录,如下所示:

class MyApp < Sinatra::Base
  configure :production, :development do
    enable :logging
  end
end

我可以将其放在namespace上吗?如果我这样声明一个应用程序,我的命名空间内容是否需要以某种方式包含在该应用程序代码中?我完全不知道它是如何工作的。

登录nginx日志几乎看起来是尝试,但这是错误行的样子:

2018/12/30 19:53:15 [error] 6615#0: *21522 connect() failed (111: Connection refused) while connecting to upstream, client: <someip>, server: api.example.com, request: "GET /api/v1/getit/thingtoget1/stuff/var1/var2/var3 HTTP/1.1", upstream: "http://[::1]:9292/api/v1/getit/thingtoget/stuff/var1/var2/var3", host: "api.example.com", referrer: "an HTML page from the nginx server"

几乎就像是尝试重新连接到服务器以检索消息或其他内容一样。但是,如果日志与我在nginx配置中声明服务器的方式有关,则为:

server {
    listen 443;
    listen [::]:443;
    server_name api.myapp.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl/myapp_com.pem;
    ssl_certificate_key /etc/nginx/ssl/star_myapp_com.key;

    location / {
      proxy_pass http://localhost:9292;
    }

}

1 个答案:

答案 0 :(得分:1)

在“日志记录”部分中查看Sinatra的README,但我倾向于在S​​inatra应用程序外部设置一个记录器,以防万一其他地方或几个应用程序一起使用,并且我可以使用同一记录器对于他们所有人。最简单的方法是全局变量(可以接受的少数几个地方之一,但这不是唯一的方法):

require 'mono_logger' # because it's thread safe
require 'pathname'    # because paths aren't strings :)

log_path = Pathname(__dir__).join("logs/app.log")
$logger = MonoLogger.new(log_path)
$logger.level = MonoLogger::INFO

然后在路线或任何地方:

get '/' do
  $logger.info "here"

在我的终端机上:

$ cat logs/app.log 
I, [2019-01-07T13:03:52.989415 #64378]  INFO -- : here

关于配置块,除非您使用模块化应用程序(请参阅README中的Modular vs. Classic Style)并且您使用的是经典样式,否则您不必担心将它们放入类声明中。 / p>

配置块没有命名空间(Sinatra::Namespace处理将路由作为参数的事物,例如getbefore),因此请遵循约定并将其粘贴在文件顶部附近

希望有帮助。