Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用默认的Rails记录器记录Ruby异常的整个跟踪?_Ruby On Rails_Ruby_Logging - Fatal编程技术网

Ruby on rails 如何使用默认的Rails记录器记录Ruby异常的整个跟踪?

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

我正在从事rails项目,并试图将异常记录到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:#{$@}"