如何使用Logger.new创建文件夹(如果不存在)?

Mau*_*ias 21 ruby logging ruby-on-rails

我正在尝试注册一个新日志

@@my_logger ||= Logger.new("#{Rails.root}/log/my.log")
Run Code Online (Sandbox Code Playgroud)

但是当我尝试生成新文件夹时,将其放入其中

@@my_logger ||= Logger.new("#{Rails.root}/log/today.to_s/my.log")
Run Code Online (Sandbox Code Playgroud)

它返回 Errno::ENOENT: No such file or directory

可能是许可问题?如何使用Logger.new创建文件夹(如果不存在)?

Mik*_*kin 41

尝试这样的事情.

  dir = File.dirname("#{Rails.root}/log/#{today}/my.log")

  FileUtils.mkdir_p(dir) unless File.directory?(dir)

  @@my_logger ||= Logger.new("#{Rails.root}/log/#{today}/my.log")
Run Code Online (Sandbox Code Playgroud)


use*_*247 11

你也可以这样做

directory_name = "name"
Dir.mkdir(directory_name) unless File.exists?(directory_name)
Run Code Online (Sandbox Code Playgroud)


Kev*_*ell 6

自动创建日志目录已在 rails 中被弃用。这是来自 Logger.new 代码的代码片段:

ActiveSupport::Deprecation.warn("Automatic directory creation for '#{log}' is deprecated. Please make sure the directory for your log file exists before creating the logger. ")
Run Code Online (Sandbox Code Playgroud)

现在接受的做法是在创建记录器之前确保日志文件(和目录)存在。

确保目录提前存在的一种方法可能是使用类似于以下内容的代码:

log_file_name = '/path/to/my.log'
unless File.exist?(File.dirname(log_file_name))
  FileUtils.mkdir_p(File.dirname(log_file_name))
end
Run Code Online (Sandbox Code Playgroud)