2015-04-27 2 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 

Обратите внимание, что в реализации readfilereadfile ваше призвание рекурсивно? Когда он выполняется, он считывает строки из файла, сопоставляет их и назначает результат @readfile; затем он вызывает readfile, и метод снова запускается; это продолжается вечно до тех пор, пока вы не упакуете взрывы из-за слишком большого количества вызовов рекурсивных методов.

Я предполагаю, что вы на самом деле имел в виду это:

@readfile = @readfile.to_s.split(" ") 
+0

Спасибо! Это исправило проблему, но теперь у меня новая ошибка неопределенного метода ip_histogram для # (NoMethodError) Я обновил код в исходном вопросе. – EnduranceMan

Смежные вопросы