Ruby on rails 如何使用默认的Rails记录器记录Ruby异常的整个跟踪?
我正在从事rails项目,并试图将异常记录到rails日志文件中。我知道我可以调用Ruby on rails 如何使用默认的Rails记录器记录Ruby异常的整个跟踪?,ruby-on-rails,ruby,logging,Ruby On Rails,Ruby,Logging,我正在从事rails项目,并试图将异常记录到rails日志文件中。我知道我可以调用logger.error$获取记录到文件的异常的第一行。但是,我还想记录整个跟踪堆栈。如何使用默认的rails logger记录异常的整个跟踪?logger.error caller.join(“\n”)应该可以做到这一点 logger.error $!.backtrace 还有,别忘了你可以 rescue ErrorType => error_name 为您的错误指定一个变量名,而不是默认的$rails
logger.error$
获取记录到文件的异常的第一行。但是,我还想记录整个跟踪堆栈。如何使用默认的rails logger记录异常的整个跟踪?logger.error caller.join(“\n”)
应该可以做到这一点
logger.error $!.backtrace
还有,别忘了你可以
rescue ErrorType => error_name
为您的错误指定一个变量名,而不是默认的
$代码>rails的工作方式
137 logger.fatal(
138 "\n\n#{exception.class} (#{exception.message}):\n " +
139 clean_backtrace(exception).join("\n ") +
140 "\n\n"
141 )
248 def clean_backtrace(exception)
249 if backtrace = exception.backtrace
250 if defined?(RAILS_ROOT)
251 backtrace.map { |line| line.sub RAILS_ROOT, '' }
252 else
253 backtrace
254 end
255 end
256 end
在Rails中,ActionController::Rescue
处理它。在我的应用程序控制器操作中,我使用此模块中的方法log\u error
在日志中精确格式化回溯:
def foo_action
# break something in here
rescue
log_error($!)
# call firemen
end
我会这样做:
以下是例外回溯的ri文档:
请注意,您还可以使用Kernel#caller,它还提供完整的跟踪(减去当前帧)
另外-请注意,如果您试图捕获所有异常,您应该从异常中解救出来,而不是从运行时错误中解救出来。在更高版本的Rails中,只需取消RAIL_ROOT/config/initializers/backtrace_dimeners.rb中的以下行的注释即可(如果不存在该文件,则添加该文件本身):
通过这种方式,您可以在发生异常时将完整回溯写入日志。这在v2.3.4中适用。您也可以使用ruby的默认变量,如下所示:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
我错过什么了吗?logger.error只接受一个参数,因此代码不起作用…这个参数不起作用,请使用logger.error e.message+“\n”+e.backtrace.join(“\n”)
。我可以发誓多个参数在4年前起作用,但可能没有。我已经将其更新为只记录回溯,这似乎是问题最相关的方面;我相信读者能够理解多个记录器调用是可能的,字符串连接(或更多的Ruby-y,插值)也是如此。不要做连接('\n')单引号:pIt是Rails 3.2.3文档的一部分。请看这里:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"