character BYTE "c"
Должно быть:
character BYTE "c",0dh,0ah,0
Rack :: CommonLogger
не будет предоставлять регистратор вашему основному приложению, он просто регистрирует запрос, как это делал бы Apache.
Проверьте код самостоятельно: https://github.com/rack/rack/blob/master/lib/rack/common_logger.rb
Все приложения Rack
имеют вызов метод, который вызывается с помощью env HTTP-запроса, если вы проверите метод вызова этого промежуточного программного обеспечения, вот что произойдет:
def call(env)
began_at = Time.now
status, header, body = @app.call(env)
header = Utils::HeaderHash.new(header)
log(env, status, header, began_at)
[status, header, body]
end
@app
в этом случае является основным приложением, промежуточное программное обеспечение просто регистрирует когда запрос начался, затем он классифицирует ваше промежуточное программное обеспечение, получая тройку [status, header, body], а затем вызывает метод частного журнала с этими параметрами, возвращая ту же тройку, которую ваше приложение вернуло в первую очередь.
Метод logger
выглядит примерно так:
def log(env, status, header, began_at)
now = Time.now
length = extract_content_length(header)
logger = @logger || env['rack.errors']
logger.write FORMAT % [
env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
env["REMOTE_USER"] || "-",
now.strftime("%d/%b/%Y %H:%M:%S"),
env["REQUEST_METHOD"],
env["PATH_INFO"],
env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
env["HTTP_VERSION"],
status.to_s[0..3],
length,
now - began_at ]
end
Как вы можете заметить, метод log
просто получает некоторую информацию из запроса env и входит в указанный регистратор. при вызове конструктора, если нет экземпляра регистратора, он переходит в регистратор rack.errors
(кажется, он есть по умолчанию)
Способ его использования (в вашей конфигурации .ru
):
logger = Logger.new('log/app.log')
use Rack::CommonLogger, logger
run YourApp
Если вы хотите иметь общий логгер во всех своих приложениях, вы можете создать простое промежуточное ПО для логгера:
class MyLoggerMiddleware
def initialize(app, logger)
@app, @logger = app, logger
end
def call(env)
env['mylogger'] = @logger
@app.call(env)
end
end
Чтобы использовать его, на вашем config.ru
:
logger = Logger.new('log/app.log')
use Rack::CommonLogger, logger
use MyLoggerMiddleware, logger
run MyApp
Надеюсь, это поможет.
В вашем config.ru
:
root = ::File.dirname(__FILE__)
logfile = ::File.join(root,'logs','requests.log')
require 'logger'
class ::Logger; alias_method :write, :<<; end
logger = ::Logger.new(logfile,'weekly')
use Rack::CommonLogger, logger
require ::File.join(root,'myapp')
run MySinatraApp.new # Subclassed from Sinatra::Application
class ErrorLogger
def initialize(file)
@file = ::File.new(file, "a+")
@file.sync = true
end
def puts(msg)
@file.puts
@file.write("-- ERROR -- #{Time.now.strftime("%d %b %Y %H:%M:%S %z")}: ")
@file.puts(msg)
end
end
class App < Sinatra::Base
if production?
error_logger = ErrorLogger.new('log/error.log')
before {
env["rack.errors"] = error_logger
}
end
...
end
Я следовал тому, что я нашел в этом блоге - выдержки ниже
require 'rubygems'
require 'sinatra'
disable :run
set :env, :production
set :raise_errors, true
set :views, File.dirname(__FILE__) + '/views'
set :public, File.dirname(__FILE__) + '/public'
set :app_file, __FILE__
log = File.new("log/sinatra.log", "a")
STDOUT.reopen(log)
STDERR.reopen(log)
require 'app'
run Sinatra.application
затем используйте puts
или print
. У меня сработало.