은의 당신이 시도 것을 볼 수있는 의무적 인 요청과 함께 시작하자.
확장 성은 로그 파일을 처리 할 때 커다란 문제가 될 수 있습니다. 확장 형식은 표준 로그 형식보다 작지만 여전히 대량의 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
루프를 추출 할 수 있습니다.
줄 사이에 \ t 문자가 나뉘어 있는지 궁금합니다. 나는 실제로 아파치 로그를 파싱하지 않는다. 확장 로그 파일 형식으로 쓰여진 내용은 일반적으로 구문 분석하고 싶습니다. – camwest
파일이 엄격하게 확장 로그 파일 형식 인 경우 탭에서 분할하면 잘 작동합니다 ... 누군가가 귀엽고 필드를 추가 할 때까지 해당 필드에 탭을 추가합니다. 명시 적 필드 길이 또는 정규식을 사용하여 필드로 분할하면 해당 상황에서 더 잘 작동합니다. –
여기에있는 사양에 따르면 : https://www.w3.org/TR/WD-logfile.html 탭을 필드 구분 문자로 사용하는 것이 좋습니다. 사양에서 : "필드는 공백으로 구분됩니다.이 목적으로 탭 문자를 사용하는 것이 좋습니다." –