【问题标题】:Disable IP address logging Rails禁用 IP 地址记录 Rails
【发布时间】:2014-03-28 06:35:49
【问题描述】:

我正在尝试在处理请求时禁用 IP 地址记录。但我无法找到一种方法来做到这一点。我想为我的应用程序中用户尚未通过身份验证的有限部分禁用 IP 记录。

所以我的问题是

如何在特定页面的 Rails 日志中禁用 IP 记录(因此 IP 不会保存在任何日志中)

我正在使用Rails 3.2.17

编辑: 这是示例日志(来​​自 environment.log)

在 2014-03-28 11:53:20 +0530 开始 GET "/my_path" for 192.168.0.109

我不想在日志文件中保存192.168.0.109

【问题讨论】:

  • 显示您期望的示例日志?

标签: ruby-on-rails ruby ruby-on-rails-3 logging ip


【解决方案1】:

在 config/initializers 中,添加文件 log_fomat.rb :

class ActiveSupport::BufferedLogger
  def formatter=(formatter)
    @log.formatter = formatter
  end
end

class Formatter
  SEVERITY_TO_TAG_MAP     = {'DEBUG'=>'meh', 'INFO'=>'fyi', 'WARN'=>'hmm', 'ERROR'=>'wtf', 'FATAL'=>'omg', 'UNKNOWN'=>'???'}
  SEVERITY_TO_COLOR_MAP   = {'DEBUG'=>'0;37', 'INFO'=>'32', 'WARN'=>'33', 'ERROR'=>'31', 'FATAL'=>'31', 'UNKNOWN'=>'37'}
  USE_HUMOROUS_SEVERITIES = true

  def call(severity, time, progname, msg)
    if USE_HUMOROUS_SEVERITIES
      formatted_severity = sprintf("%-3s","#{SEVERITY_TO_TAG_MAP[severity]}")
    else
      formatted_severity = sprintf("%-5s","#{severity}")
    end

    formatted_time = time.strftime("%Y-%m-%d %H:%M:%S.") << time.usec.to_s[0..2].rjust(3)
    color = SEVERITY_TO_COLOR_MAP[severity]

    "\033[0;37m#{formatted_time}\033[0m [\033[#{color}m#{formatted_severity}\033[0m] #{msg.strip} (pid:#{$$})\n"
  end

end

Rails.logger.formatter = Formatter.new

参考资料:

  1. http://rubyjunky.com/cleaning-up-rails-4-production-logging.html
  2. http://cbpowell.wordpress.com/2012/04/05/beautiful-logging-for-ruby-on-rails-3-2/
  3. Rails logger format string configuration

【讨论】:

    【解决方案2】:

    最后通过使用 emaillenin 的答案 thanx emaillenin 做到了这一点:D.

    解决办法

      # Overriding Rails logger to not save IP addresses for specific paths
      # Put this file in <app_root>/config/initializers
    
      # defining setter for Rails default log formatter, so later we can set our custom logger using '='
      class ActiveSupport::BufferedLogger
        def formatter=(formatter)
          @log.formatter = formatter
        end
      end
    
      # Modified Formatter Class with custom 'call' method
      class Formatter
        Format = "%s\n"
        # Remove IP while getting request on below specified Path
        FilteredActionRegexp = /app_path|another_path/i
    
        # reference for regexp of IP address
        # http://answers.oreilly.com/topic/318-how-to-match-ipv4-addresses-with-regular-expressions/
        IPRegexp = /\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/
        FilteredString = '**FILTERED**'
    
        def call(severity, time, progname, msg)
          Format % [msg2str(filter_ip(msg))]
        end
    
        private
    
        def msg2str(msg)
          case msg
          when ::String
            msg
          when ::Exception
            "#{ msg.message } (#{ msg.class })\n" <<
              (msg.backtrace || []).join("\n")
          else
            msg.inspect
          end
        end
    
        # Replace IP Address with custom string if action is filtered
        def filter_ip(msg)
          # Replace only if message contains filtered action
          if msg =~ FilteredActionRegexp
            # If log string contains IP address then remove it with custom string
            msg.gsub(IPRegexp, FilteredString )
          else
            msg
          end
        end
      end
    
      # Override Rails default logger formatter
      Rails.logger.formatter = Formatter.new
    

    【讨论】:

    • 对于最新版本的 Rails(在 5.1.6 上测试)不再需要定义 ActiveSupport::BufferedLogger#formatter=
    【解决方案3】:

    我用Lograge

    驯服 Rails 的默认请求日志

    而不是像这样拥有无法解析的日志输出:

    Started GET "/" for 127.0.0.1 at 2012-03-10 14:28:14 +0100
    Processing by HomeController#index as HTML
      Rendered text template within layouts/application (0.0ms)
      Rendered layouts/_assets.html.erb (2.0ms)
      Rendered layouts/_top.html.erb (2.6ms)
      Rendered layouts/_about.html.erb (0.3ms)
      Rendered layouts/_google_analytics.html.erb (0.4ms)
    Completed 200 OK in 79ms (Views: 78.8ms | ActiveRecord: 0.0ms)
    

    你会得到包含所有重要信息的一行,如下所示:

    method=GET path=/jobs/833552.json format=json controller=jobs action=show status=200 duration=58.33 view=40.43 db=15.26
    

    【讨论】:

    • 我们只想过滤 IP。我们应该可以看到当前版本不支持的参数和请求时间。
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2013-05-08
    • 1970-01-01
    相关资源
    最近更新 更多