2010-07-27 3 views
1

W3C 확장 로그 파일 형식에 대한 루비 파서를 찾고 있습니다.Ruby의 확장 로그 파일 구문 분석기

http://www.w3.org/TR/WD-logfile.html

이상적으로는 로그 파일의 필드를 기반으로 다차원 배열을 생성합니다. 나는 FasterCSV (http://fastercsv.rubyforge.org/)가 CSV 파일을 다루는 것과 비슷한 것을 생각하고있다.

그런 라이브러리가 있는지 누가 알 수 있습니까? 그렇지 않다면 누구나 내가 어떻게 지을 지 조언 해 줄 수 있습니까?

나는 텍스트 파일을 배열로 변환하기 위해 문자열 조작을 알아낼 수 있다고 확신한다. 나는 대용량 로그 파일을 처리하는 것에 대해 대부분 염려하고있다. (잠재적으로 나는 데이터를 디스크 나 다른 것으로 스트리밍 할 필요가있다.)

감사

, 카메론

답변

0

은의 당신이 시도 것을 볼 수있는 의무적 인 요청과 함께 시작하자.

확장 성은 로그 파일을 처리 할 때 커다란 문제가 될 수 있습니다. 확장 형식은 표준 로그 형식보다 작지만 여전히 대량의 RAM을 사용할 가능성을 알고 있어야합니다.

정규식 또는 간단한 하위 문자열 추출을 사용할 수 있습니다. 하위 문자열 추출은 빠르지 만 멋진 요소가 없습니다.

 
require 'benchmark' 

TIME_REGEX  = /(\d\d:\d\d:\d\d)/ 
ACTION_REGEX = /(\w+)/ 
FILEPATH_REGEX = /(\S+)/ 

ary = %(#Version: 1.0 
#Date: 12-Jan-1996 00:00:00 
#Fields: time cs-method cs-uri 
00:34:23 GET /foo/bar.html 
12:21:16 GET /foo/bar.html 
12:45:52 GET /foo/bar.html 
12:57:34 GET /foo/bar.html 
).split(/\n+/) 

n = 50000 
Benchmark.bm(6) do |x| 
    x.report('regex') do 
    n.times do 
     ary.each do |l| 
     next if l[/^#/] 
     l.strip! 
     # l[/^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/ix] 
     # l =~ /^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/ix 
     l =~ /^ #{ TIME_REGEX } \s #{ ACTION_REGEX } \s #{ FILEPATH_REGEX } $/iox 
     timestamp, action, filepath = $1, $2, $3 
     end 
    end 
    end 

    x.report('substr') do 
    n.times do 
     ary.each do |l| 
     next if l[/^#/] 
     l.strip! 
     timestamp = l[0, 8] 
     action = l[9, 3] 
     filepath = l[14 .. -1] 
     end 
    end 
    end 
end 

# >>    user  system  total  real 
# >> regex 1.220000 0.000000 1.220000 ( 1.235210) 
# >> substr 0.800000 0.010000 0.810000 ( 0.804276) 

다른 정규 표현식을 실행하여 미묘한 변경으로 인해 런타임에서 큰 차이가 나는지 확인하십시오.

벤치 마크 코드의 정규 표현식과 부분 스트링 버전 모두에서 찾고자하는 것을 기초로 ary.each do 루프를 추출 할 수 있습니다.

+0

줄 사이에 \ t 문자가 나뉘어 있는지 궁금합니다. 나는 실제로 아파치 로그를 파싱하지 않는다. 확장 로그 파일 형식으로 쓰여진 내용은 일반적으로 구문 분석하고 싶습니다. – camwest

+0

파일이 엄격하게 확장 로그 파일 형식 인 경우 탭에서 분할하면 잘 작동합니다 ... 누군가가 귀엽고 필드를 추가 할 때까지 해당 필드에 탭을 추가합니다. 명시 적 필드 길이 또는 정규식을 사용하여 필드로 분할하면 해당 상황에서 더 잘 작동합니다. –

+0

여기에있는 사양에 따르면 : https://www.w3.org/TR/WD-logfile.html 탭을 필드 구분 문자로 사용하는 것이 좋습니다. 사양에서 : "필드는 공백으로 구분됩니다.이 목적으로 탭 문자를 사용하는 것이 좋습니다." –