2009-12-04 58 views
0

与使用File.Open错误使用Ruby和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

什么是你得到的错误消息:无NoMethodError: undefined method +”:NilClass`?

如果是,则then Socket.gethostname().gsub!(/[[:space:].]/,"")回零

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

应该将日志文件有什么名字?

+0

我猜这意味着它是如此处理与尝试运行应用程序的方式? – Aran 2009-12-04 16:24:12

+0

可能是应用程序代码中的问题。你能提供更多的细节,也许更多的代码? – philant 2009-12-04 16:28:06

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编码风格的方法。原来真的很糟糕。

0

还有比Ruby代码风格,可以提高更多:

  • 使用的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 

而且那么y OU可以进一步提高,通过不重塑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兼容,但有更多的选择...