Ruby和File.open的错误

时间:2009-12-04 15:49:15

标签: ruby file

使用File.Open

的Ruby脚本出现问题

以下是我所说的代码......

f = File.open(Socket.gethostname()。gsub!(/ [[:space:]。] /,“”)+“。log”,“a”)

问题是.open中的+,它返回一条错误消息,说明它是一个未定义的方法。

任何人都可以提供帮助吗?

编辑: 以下是该类中导致问题的一些代码。

不确定这是否会有所帮助。

def logExecution()
  f = File.open(Socket.gethostname().gsub!(/[[:space:].]/,"")+".log","a")
  f.puts(" [" + Time.new().to_s() + "] " +\
         File.basename($0) + " " + $*.join(" "))
  f.close
end

3 个答案:

答案 0 :(得分:3)

您收到的错误消息是什么:NoMethodError: undefined method +'代表nil:NilClass`?

如果是,then Socket.gethostname().gsub!(/[[:space:].]/,"")将返回nil

如何创建插座?您可以尝试使用完全限定的域名,即“myhost.mydomain.com”而不是“myhost”。

您的日志文件应该有什么名称?

答案 1 :(得分:1)

首先,没有真正令人信服的理由从主机名中剥离点。 “www.example.com.log”是比“wwwexamplecom.log”更好的文件名。所以我的建议是使用它:

def log_execution
  hostname = (Socket.gethostname() || "localhost")
  File.open(hostname + ".log", "a") do |f|
    f.puts(
      " [" + Time.new.to_s + "] " +
      File.basename($0) + " " + $*.join(" ")
    )
  end
end

但如果你真的必须,那就用这个:

def log_execution
  hostname = (Socket.gethostname() || "localhost")
  File.open(hostname.gsub(".", "") + ".log", "a") do |f|
    f.puts(
      " [" + Time.new.to_s + "] " +
      File.basename($0) + " " + $*.join(" ")
    )
  end
end

本质上,这段代码只记录正在运行的命令的名称以及用于调用它的命令行参数。另请注意,我重命名并重新格式化了方法以使用标准的Ruby编码样式。原来真的很糟糕。

答案 2 :(得分:0)

您可以改进的不仅仅是红宝石代码风格:

  • 使用gethostbyname,并救援到默认
  • 使用块打开文件,确保在抛出某些内容时,文件已关闭

结果将是:

require 'socket'

def log_execution()
  logname = Socket.gethostbyname(Socket.gethostname).first rescue "localhost"
  File.open("#{logname}.log", 'a') do |f|
    f.puts(" [" + Time.new().to_s() + "] " + File.basename($0) + " " + $*.join(" "))
  end
end

然后你可以通过不重新发明stdlib来进一步改进:

require 'socket'
require 'logger'

# do only once in your program
logname = Socket.gethostbyname(Socket.gethostname).first rescue "localhost"
log = Logger.new(logname)
log.level = Logger::WARN

然后使用标准api登录:

log.info("hello!")
log.warn("message!")

如果您不喜欢以下格式:

W, [2009-12-05T03:05:48.764552 #22759]  WARN -- : message!

你可以使用log4r,这是api兼容但有更多选项......