Rails 5 logstash生成的日志项太多而不是一个

时间:2017-11-24 11:46:34

标签: ruby-on-rails logging logstash kibana

有什么办法可以自定义标准错误的记录方式吗?从Rails 5开始,logstash会收到一个致命错误,因为它有很多错误项。 Rails 4只创建了一个项目(我喜欢它的方式)

问题似乎是,自从Rails 5以来,log_error中间件的DebugExceptions方法分别打印了调用logger.fatal的所有后退行,而不是Rails 4,它们连接起来在调用logger.fatal之前,所有行都只有一个字符串。

相比:

Rails 4:debug_exceptions.rb

message = "\n#{exception.class} (#{exception.message}):\n"
message << exception.annoted_source_code.to_s if exception.respond_to?(:annoted_source_code)
message << "  " << trace.join("\n  ")
logger.fatal("#{message}\n\n")

Rails 5:debug_exceptions.rb

logger.fatal "  "
logger.fatal "#{exception.class} (#{exception.message}):"
log_array logger, exception.annoted_source_code if exception.respond_to?(:annoted_source_code)
logger.fatal "  "
log_array logger, trace

我使用logstash-logger:json_lines格式化程序通过UDP。

我使用的logstash配置非常适用于rails 4和其他应用程序,但不适用于rails 5(因为它将一个错误分成几个)。

我知道,我可以使用rescue_from来挽救控制器中的错误,但这不会发现路由或其他错误,我猜?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

实际上,对于错误处理,使用专用的异常跟踪解决方案(如滚动杆,刹车,哨兵,errbit或类似工具)更为方便。 重点是您需要例外:

  1. 一种快速查明发生的位置和条件的快速方法,包括请求参数,用户ID,标头等。默认情况下,并非所有这些信息都会写入日志。但是大多数异常捕获程序还会记录有关该请求的其他信息。
  2. 发出警报,但不要太吵,因为在生产中出现问题时-您很快就会记录数百个错误,并且不能简单地将所有这些错误转发到您的电子邮件或即时消息中。因此必须支持聚合
  3. 可选,但有用-跟踪打开/解决的错误

即使对异常日志进行了标记和索引,也很难导航原始日志,也有可能出现这样的情况:当您遇到一个嘈杂的非关键任务异常时,会淹没日志,使您错过一些罕见的真正重要的事件一个。

关于在rails中捕获异常-最好在中间件中执行,就像上面提到的所有工具(以及rails本身)一样:

class MyExceptionMidleware
  def initialize(app)
    @app = app
  end

  def call(env)
    @app.call(env)
  rescue => e
    # handle the error any way you like, for example:
    Rails.logger.fatal("oops, #{e.inspect}, backtrace: #{e.backtrace.join("\n")}")
  end
end
config.middleware.insert_after(ActionDispatch::DebugExceptions, MyExceptionMidleware)

(或insert_before,但是那样的话,如果您不引发异常,或者如果它发生在中间件本身中,则不记录异常)