有人为我开发了一个运行良好的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;
}
}
答案 0 :(得分:1)
在“日志记录”部分中查看Sinatra的README,但我倾向于在Sinatra应用程序外部设置一个记录器,以防万一其他地方或几个应用程序一起使用,并且我可以使用同一记录器对于他们所有人。最简单的方法是全局变量(可以接受的少数几个地方之一,但这不是唯一的方法):
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处理将路由作为参数的事物,例如get
和before
),因此请遵循约定并将其粘贴在文件顶部附近
希望有帮助。