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兼容,但有更多的選擇...