Rack::CommonLogger
не предоставит регистратор вашему основному приложению, он просто зарегистрирует запрос, как это сделал бы Apache.
Проверьте код самостоятельно: https://github.com/rack/rack/blob/master/lib/rack/common_logger.rb
Все Rack
приложения имеют метод вызова, который вызывается с помощью HTTP-запроса env, если вы проверите метод вызова этого промежуточного программного обеспечения, вот что происходит:
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
регистратор (кажется, что он есть по умолчанию)
Способ его использования (в вашем config.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
Надеюсь, это поможет.