有什么办法可以自定义标准错误的记录方式吗?从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
来挽救控制器中的错误,但这不会发现路由或其他错误,我猜?
提前谢谢。
答案 0 :(得分:2)
实际上,对于错误处理,使用专用的异常跟踪解决方案(如滚动杆,刹车,哨兵,errbit或类似工具)更为方便。 重点是您需要例外:
即使对异常日志进行了标记和索引,也很难导航原始日志,也有可能出现这样的情况:当您遇到一个嘈杂的非关键任务异常时,会淹没日志,使您错过一些罕见的真正重要的事件一个。
关于在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
,但是那样的话,如果您不引发异常,或者如果它发生在中间件本身中,则不记录异常)