我正在尝试定义解析apache日志文件的方法,并提取ip地址,URL,每小时请求和错误代码。我已经让一切都在方法之外工作了,但是当我试图将这些代码放入方法中时,我不断收到错误消息“堆栈级别太深”。这是有问题的代码。
class CommonLog
def initialize(logfile)
@logfile = logfile
end
def readfile
@readfile = File.readlines(@logfile).map { |line|
line.split()
}
@readfile = @readfile.to_s.split(" ")
end
def ip_histogram
@ip_count = 0
@readfile.each_index { |index|
if (@readfile[index] =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ )
puts @readfile[index]
puts @ip_count += 1
end
}
end
def url_histogram
url_count = 0
cleaned_file.each_index { |index|
if (cleaned_file[index] =~ /\/{1}(([a-z]{4,})|(\~{1}))\:{0}\S+/ )
puts cleaned_file[index]
puts url_count += 1
end
}
end
def requests_per_hour
end
def sorted_list
end
end
my_file = CommonLog.new("test_log")
cleaned_file = my_file.readfile
puts cleaned_file.ip_histogram
答案 0 :(得分:0)
问题似乎在于CommonLog#readfile
方法:
def readfile
@readfile = File.readlines(@logfile).map { |line|
line.split()
}
@readfile = readfile.to_s.split(" ")
end
请注意,在readfile
的实现中,您的调用readfile
是递归的吗?执行时,它从文件中读取行,映射它们并将结果分配给@readfile
;然后它调用readfile
并且该方法再次开始执行;这种情况会持续下去,直到你因为太多的递归方法调用而导致堆栈爆炸。
我假设你的意思是:
@readfile = @readfile.to_s.split(" ")