如何将特定请求详细信息记录到rails服务器日志

时间:2012-06-29 19:03:50

标签: ruby-on-rails ruby logging heroku

我通常不喜欢直接询问如何在不了解正在发生的事情的情况下做些什么,但我对rails非常陌生,而且我很难完成这项工作。

基本上,我需要在单个日志语句中捕获每个请求的以下信息(如果可能)

  • 日志条目的日期
  • 日志输入时间
  • HTTP方法
  • 请求的网址
  • 端口
  • 请求者的IP地址
  • 请求者的用户代理
  • 引用网址
  • HTTP响应代码
  • 主机名

    自定义日志格式的首选方法是什么?是否可以只修改现有日志并将其传递给它?或者我是否需要扩展和覆盖我需要的行为?

    我不需要将其保存到其他日志文件或其他任何内容,只需在每次请求时输出到STDOUT。

    对此的任何帮助将不胜感激。

    谢谢!

  • 2 个答案:

    答案 0 :(得分:14)

    我知道这是一个老问题,但是对于未来的人来说,我认为Rails 3.2+中的首选方法是使用ActiveSupport :: TaggedLogging。介绍此内容的博文是here

    这是一个快速示例,它为每个日志消息添加子域,每个请求的UUID和用户代理。您可以在环境初始化文件中弹出它。

    config.log_tags = [ :subdomain, :uuid, lambda { |request| request.user_agent } ]
    

    答案 1 :(得分:9)

    我相信您请求的大部分信息(如果不是全部的话)都可以在请求标头和响应中找到。有关如何将其添加到日志的信息已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记录器也是非常可定制的,并且已经存在一些项目可能满足您更换默认日志记录的需要,或作为如何创建有用格式的灵感:

    • lograge - 使用单行键值输出替换默认Rails日志记录,但尚未执行请求参数
    • scrolls - 更通用的上下文,键值