禁用IP地址记录Rails

3
我正在尝试在处理请求时禁用IP地址的记录。但是我无法找到这样做的方法。我想在我的应用程序的有限部分禁用IP记录,该部分用户尚未经过身份验证。
所以我的问题是:
如何禁用特定页面的rails日志中IP的记录(因此IP将不会保存在任何日志中)?
我正在使用Rails 3.2.17
编辑: 以下是示例日志(来自environment.log)
Started GET "/my_path" for 192.168.0.109 at 2014-03-28 11:53:20 +0530
我不想将192.168.0.109保存在日志文件中。

展示一个你期望的日志样本? - Raj
3个回答

3

在config/initializers目录下,添加log_format.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(英文)
这些参考资料都是关于如何优化 Rails 项目日志的,可以帮助开发者更好地管理和调试代码。

1

最终我使用了emaillenin的答案,谢谢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

1
对于最近版本的Rails(测试版本为5.1.6),不再需要定义ActiveSupport :: BufferedLogger#formatter = - Janosch

0

我使用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。我们应该能够看到当前版本不支持的参数和请求时间。 - Hardik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接