2016-03-03 3 views
1

У меня есть приложение Sinatra, которое выводит постоянный поток информации в STDOUT через экземпляр Logger. Я также включил ведение журнала Sinatra и регистрацию в стойке. Для аргументации скажем, что это хорошая идея.Как получить SInatra и Rack для вывода на экземпляр Logger?

Вот что результат выглядит на данный момент:

[2016-03-03 11:32:38] INFO WEBrick 1.3.1 
[2016-03-03 11:32:38] INFO ruby 2.3.0 (2015-12-25) [x86_64-linux] 
[2016-03-03 11:32:38] INFO WEBrick::HTTPServer#start: pid=12303 port=4567 
[03/03/16 11:32:45] core/lib/registry.rb  INFO Resolving request for u:/swingshift/registry a:GET 
[03/03/16 11:32:45] core/lib/registry.rb  INFO SwingShift::RegistryController has been selected... 
10.192.0.136 - - [03/Mar/2016:11:32:45 +0000] "GET /swingshift/registry HTTP/1.1" 200 10227 0.0557 
10.192.0.136 - - [03/Mar/2016:11:32:46 +0000] "GET /css/bootstrap.min.css HTTP/1.1" 304 - 0.0023 

Как вы можете видеть, это немного беспорядок. Я хотел бы сказать Синатре и Стойку использовать мой экземпляр Логгера, а не их собственные.

  • Как заставить Sinatra использовать мой регистратор?
  • Как получить стойку для использования моего регистратора?

(С другой стороны, я могу передать процедурный к их лесорубов форматировать их же? Это не так хорошо, но это было бы что-то.)

Вот эти мои настройки Sinatra блок. На данный момент $ регистраторе уже указывает на мой экземпляр Logger:

configure do             
    $logger.info(__FILE__){"Starting..."}      
    set :bind, '0.0.0.0'          
    enable :sessions           
    set :session_secret, 'whatever' 

    set :views, BASEDIR 
    set :haml, :layout_options => { :views => 'core/views' } 

    enable :logging           
    set :dump_errors, true          
end      

Я также получил

use Rack::CommonLogger, $logger 

... но это, кажется, не делать ничего.

Update :: Я знаю https://stackoverflow.com/questions/2239240A/use-rackcommonlogger-in-sinatra, но:

  • Это не касается Синатры протоколирования, просто Rack
  • Принятый ответ представляется чрезвычайно сложным и существует целый ряд без ответа моменты, поднятые в комментариях к нему. (Мне действительно нужно, чтобы установить регистратор в config.ru и добавить промежуточный слой протоколирования ли? Является ли синтаксис для лесозаготовительного слоя неправильно, а> = 4-х человека, кажется, думает?)

Согласно Sinatra I» м должен быть способен управлять стойкой из своего блока settings. Разве это не так?

Обновление 2: Теперь у меня есть правильный вариант решения другого вопроса. Реализация его как есть ... абсолютно ничего для журнала здесь.

+0

Возможный дубликат [Использование Rack :: CommonLogger в Синатры] (http://stackoverflow.com/questions/2239240/use- rackcommonlogger-in-sinatra) – Anthony

ответ

0

Я не использую WEBrick но Thin (set :server, 'thin') В любом случае в соответствии с конфигурацией Синатра перенаправить rack.errors на мой $logger:

class IOToLog < IO 
    def initialize(logger) 
    @logger = logger 
    end 
    def write(string) 
    @logger.debug {"SINATRA #{string.strip}"} 
    end 
end 
IOTOLOG = IOToLog.new($logger) 

before { 
    env["rack.errors"] = IOTOLOG 
} 

и выход:

2017-06-21 15:44:46.166 DEBUG SINATRA 127.0.0.1 - - [21/Jun/2017:15:44:46 +0200] "GET /wd/hub/status HTTP/1.1" 200 83 0.0004 
2017-06-21 15:44:51.167 DEBUG SINATRA 127.0.0.1 - - [21/Jun/2017:15:44:51 +0200] "GET /wd/hub/status HTTP/1.1" 200 83 0.0004 

КСТАТИ Я попробовал env["rack.logger"] = $logger но не повезло.

+0

Ницца! К сожалению, все, что IOToLog получает, представляет собой предварительно отформатированную строку из регистратора стойки. Я не могу переформатировать его, чтобы сделать его таким же, как и мои другие сообщения журнала. Но это самый близкий ответ, который я когда-либо получал. Большое спасибо. Поставить галочку. –

0

Я не могу прокомментировать, так что отправьте ответ. Вы можете отформатировать сообщения, идущие в IOToLog. Вам нужно установить формат перед блоком.Может быть что-то вроде

before { 
    env["rack.errors"] = IOTOLOG 
    IOTOLOG.format 
} 

И в IOToLog добавить что-то вроде:

class IOToLog < IO 
    def format 
     @logger.formatter = proc do |severity, datetime, progname, msg| 
     "#{severity}: #{msg}\n" 
    end 
end 
+0

Ну, мне не нужно это делать, если я передам ему существующий, уже отформатированный экземпляр журнала. Но, я добавлю его в список вещей, чтобы попробовать, спасибо. –

Смежные вопросы