使用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
答案 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)
您可以改进的不仅仅是红宝石代码风格:
结果将是:
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兼容但有更多选项......