15

我通常不喜欢直接询问如何在不了解发生了什么的情况下做某事,但我对 Rails 还很陌生,而且我很难做到这一点。

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

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

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

    我不需要将其保存到不同的日志文件或任何东西,只需在每个请求上输出到 STDOUT。

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

    谢谢!

  • 4

    2 回答 2

    14

    我知道这是一个老问题,但对于未来偶然发现这个问题的人,我相信 Rails 3.2+ 中的首选方法是使用 ActiveSupport::TaggedLogging。介绍这个的博文在这里

    还有一个简单的示例,它将子域、每个请求的 UUID 和用户代理添加到每个日志消息。您可以在您的环境初始化文件中弹出它。

    config.log_tags = [ :subdomain, :uuid, lambda { |request| request.user_agent } ]
    
    于 2013-05-08T06:30:40.543 回答
    11

    我相信大多数(如果不是全部)您请求的信息都可以在请求标头和响应中找到。有关如何将其添加到日志的信息之前已得到解答,但基本上您可以在 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 日志记录,但还没有做请求参数
    • 滚动- 更通用的上下文,键值
    于 2012-07-04T05:57:30.197 回答