Нужно ли моему приложению Sinatra API объявление класса? - PullRequest
0 голосов
/ 31 декабря 2018

Кто-то разработал приложение для меня, которое работает хорошо.К сожалению, он нигде не регистрируется и журналов вообще нет.Приложение запускается командой "rackup" и находится за веб-сервером nginx.Ошибки 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 README и там было сказано, что я могу включить ведение журнала следующим образом:

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 голосов
/ 07 января 2019

Взгляните на README Синатры в разделе «Ведение журнала», но я склонен устанавливать регистратор вне приложения «Синатра» на случай, если другие биты завязываются или несколько приложений используются вместе, и я могу использоватьодин и тот же регистратор для всех из них.Простейшим способом является глобальная переменная (одно из немногих мест, где они приемлемы, но это не единственный способ):

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.) и ваш классический стиль.

Блоки конфигурации не имеют пространства имен ( Sinatra :: Namespace обрабатывает вещи, которые принимают маршрут в качестве аргумента, например get и before) поэтому следуйте соглашению и вставьте его в верхнюю часть файла.

Надеюсь, это поможет.

...