2015-04-27 157 views
0

我试图定义方法来解析通过apache日志文件,并拉IP地址,URL,每小时的请求和错误代码。我已经在方法之外使用了所有的东西,但是当试图将这些代码放入方法中时,我总是收到错误消息“堆栈层太深”。这是有问题的代码。Ruby方法变量声明

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 
+1

您的代码太长,你的解释不够。 “方法”是什么意思?你是指HTTP方法还是Ruby方法?哪部分代码是?你可以减少你的代码,只有相关的代码保留下来吗?另外,您是否可以在输入文件中包含两到三个示例行,以便我们可以自己测试您的代码? – Amadan

回答

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(" ") 
+0

谢谢!这解决了问题,但现在我有一个新的错误未定义的方法'ip_histogram'为#(NoMethodError) 我更新了原始问题中的代码。 – EnduranceMan