在Ruby中将错误写入日志文件

时间:2018-11-19 04:15:08

标签: ruby logging error-handling fileutils

我正在尝试捕获错误,检查/ tmp目录,然后将错误写入该目录中的日志文件,目前我得到:

.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/fileutils.rb:252:in `mkdir': Permission denied @ dir_s_mkdir - /temp

这是我的代码:

require 'logger'
require 'tmpdir'

temp = Dir.tmpdir()
log = Logger.new File.open("#{temp}/error.log", 'w')
log.level = Logger::INFO

begin

rescue StandardError => e
   log.error "Error - #{e}"
   puts "For detailed error messages, see: #{temp}/error.log"
end

我认为此错误是因为我试图做一些我没有权限做的事情,我不了解的是有一种干净的方法来实现我的意图吗?预先感谢您在此问题上花费的所有时间。

我已经用更新后的代码(可以回答我的问题)对其进行了编辑。感谢您的所有投入。

2 个答案:

答案 0 :(得分:1)

要使其运行并与Windows兼容:

require 'logger'
require 'tmpdir'

tmp = Dir.mktmpdir
log = Logger.new File.open(File.join(tmp, 'error.log', 'w')
log.level = Logger::INFO

begin
  # your code here
rescue StandardError => e
  log.error "Error - #{e}"
  puts "For detailed error messages, see the file: /temp/error.log"
end

答案 1 :(得分:-1)

  1. 您不应创建 / tmp 目录-该目录始终存在。
  2. 您应将def update_posterior(y, x, prior_mu, prior_V, prior_a, prior_b, I): # Building blocks used to keep following calculation cleaner x_transpose = x.transpose() n = len(y) residuals = y - np.dot(x, prior_mu.transpose()) # Calculation of posterior parameters # Below is equivalent to np.linalg.inv(prior_V_inverse + np.dot(x_transpose, x)) but significantly faster V_posterior = prior_V - np.true_divide(np.linalg.multi_dot((prior_V, x_transpose, x, prior_V)), 1 + np.matmul(np.matmul(x, prior_V), x_transpose)) # Below is equivalent to mu_posterior = np.dot(V_posterior, (np.matmul(prior_V_inverse, prior_mu.transpose()) + np.matmul(x_transpose, y))).transpose() but significantly faster mu_posterior = np.dot(V_posterior, np.linalg.solve(prior_V, prior_mu.transpose()) + np.matmul(x_transpose, y)).transpose() a_posterior = prior_a + n/2 b_posterior = np.asscalar(prior_b + (np.matmul(np.matmul(residuals.transpose(), np.linalg.inv((np.identity(n) + np.matmul(np.matmul(x, prior_V), x_transpose)))), residuals))/2) return mu_posterior, V_posterior, a_posterior, b_posterior 放在检查代码上方,而不是下方。
    require 'logger'
    require 'fileutils'

    begin
      log = Logger.new File.open('/tmp/error.log', 'w')
      log.level = Logger::INFO  
    rescue StandardError => e
      puts "Error - #{e}"
    end