【问题标题】:How to log specific request details to rails server logs如何将特定请求详细信息记录到 Rails 服务器日志
【发布时间】:2012-07-01 07:47:42
【问题描述】:
我通常不喜欢直接询问如何做某事而不了解正在发生的事情,但我对 Rails 还很陌生,很难做到这一点。
基本上,我需要在单个日志语句中为每个请求捕获以下信息(如果可能的话)
日志条目的日期
日志条目时间
HTTP 方法
请求的 URL
端口
请求者的IP地址
请求者的用户代理
引用 URL
HTTP 响应代码
主机名
自定义日志格式的首选方式是什么?是否可以只修改现有日志并将此信息传递给它?还是我需要扩展和覆盖我需要的行为?
我不需要将它保存到不同的日志文件或任何东西,只需在每次请求时输出到 STDOUT。
对此的任何帮助将不胜感激。
谢谢!
【问题讨论】:
标签:
ruby-on-rails
ruby
logging
heroku
【解决方案1】:
我相信大部分(如果不是全部)您请求的信息都可以在请求标头和响应中找到。有关如何将其添加到日志的信息是 answered before,但基本上您可以在 ApplicationController 中使用 around_filter 来记录您关心的来自请求标头的信息。例如,您可以从请求中记录用户代理并从响应中记录状态代码:
class ApplicationController < ActionController::Base
around_filter :global_request_logging
def global_request_logging
logger.info "USERAGENT: #{request.headers['HTTP_USER_AGENT']}"
begin
yield
ensure
logger.info "response_status: #{response.status}"
end
end
end
就获得您想要的格式而言,如果您包装调用,您可以输出您想要的任何格式。此外,Rails 记录器也非常可定制,并且已经存在一些项目可能满足您替换默认记录的需求或作为如何创建有用格式的灵感:
【解决方案2】:
我知道这是一个老问题,但对于偶然发现这个问题的未来人,我相信 Rails 3.2+ 中的首选方法是使用 ActiveSupport::TaggedLogging。介绍这个的博文是here
还有一个快速示例,它将子域、每个请求的 UUID 和用户代理添加到每个日志消息中。您可以在您的环境初始化文件中弹出它。
config.log_tags = [ :subdomain, :uuid, lambda { |request| request.user_agent } ]