2010-07-25 4 views
2

여러 개의 가상 호스트를 호스팅하는 VPS가 있습니다. 각 호스트는 자신의 access.log 및 error.log를 가지고 있습니다. 현재 로그 회전 설정은 없지만 변경 될 수 있습니다.내 로그 파서를 코딩하는 방법에 대한 아이디어가 필요합니다.

기본적으로 대역폭을 모니터링하고 통계를 수집하기 위해 이러한 로그를 구문 분석하려고합니다.

제 생각에는 파서를 작성하고 정보를 작은 sqlite 데이터베이스에 저장하는 것이 었습니다. 스크립트는 5 분마다 실행되며 Python의 seektell 메서드를 사용하여 마지막으로 구문 분석 된 위치에서 로그 파일을 엽니 다. 이렇게하면 5 분마다 10GB 로그 파일을 구문 분석하지 못하게됩니다. 필요한 모든 정보가 끝나면 새로운 정보가 나타납니다 (로그 회전은 없습니까?)./

을 어떻게 다른 :

은 몇 가지 생각 후, 나는 내가 뭘 모두가 한 위치에서 다른 위치로 데이터를 이동 ... 로그 파일의 정보를 복용하고 데이터베이스에 넣어 것을 깨달았 내가 할 수 있을까? test.com에 대한 로그 파일을 열고 나에게 지정된 오일에 사용되는 대역폭을 보여줄 것

python logparse.py --show=bandwidth --between-dates=25,05|30,05 --vhost=test.com 

이 : 내가 좋아하는 뭔가를 할 수 있어야합니다.

이제 내 질문은 5 일 분량의 데이터 만 원할 때 어떻게하면 10GB 상당의 데이터를 구문 분석하지 못하게 할 수 있습니까?

로그 데이터를 5 분마다 데이터베이스에 저장한다는 아이디어를 사용했다면 날짜의 유닉스 타임 스탬프를 저장하고 그 날짜 사이의 데이터를 꺼낼 수있었습니다. 쉬운. 하지만 로그 파일을 직접 구문 분석하는 것을 선호합니다.

답변

0

, 마지막 위치 당신은 로그 파일의 구문 분석을 완료 한

를 저장 전체 파일 경로와 위치를 모두 참조 데이터베이스의 테이블에 위치를 저장합니다. 5 분 후에 파서를 실행하면 구문 분석 할 로그를 데이터베이스에 쿼리하여 위치를 검색하고 거기에서 시작합니다.

저장 데이터

로그 파일의 첫 번째 행을 포함 할 데이터베이스에 additionnal 키를 추가, 회전 로그가의 첫 번째 줄. 그래서 파일로 시작할 때는 먼저 첫 번째 줄을 읽으십시오. 데이터베이스를 쿼리 할 때 파일 이름이 아니라 첫 번째 행을 확인해야합니다.

타임 스탬프가 있기 때문에 첫 번째 줄은 항상 고유해야합니다. 그러나 W3C 호환 로그 파일은 일반적으로 파일의 시작 부분에 헤더를 쓰는 것을 잊지 마십시오. 따라서 첫 번째 줄이 첫 번째 줄이어야합니다.

저장 데이터 당신은 W3C를 구문 분석하는 경우에만

, 그것은 보낸 바이트를 읽는 것은 매우 간단합니다. 해당 정보 만 유지하면 구문 분석이 매우 빠릅니다. 데이터베이스의 기존 행을 갱신하거나 나중에 쿼리에서 다른 행과 집계 할 수있는 시간 소인을 새 행에 추가하여 데이터베이스에 저장하십시오.

은 무슨 일을하는 것은 매우 특수한 경우를 제외하고, 당신이 웹에 오픈 소스 파서를 잡기 위해 운영자 추천 바퀴

를 재발견하지 마십시오. http://awstats.sourceforge.net/

2

매일 다른 로그 파일을 작성하지 않으면 요청시 전체 로그를 구문 분석 할 수있는 방법이 없습니다.

나는 로그 데이터를 보관하기 위해 데이터베이스를 사용하지만 원하는 시간 단위 해상도 (예 : 하루/시간 간격으로 대역폭 유지)를 사용합니다. 데이터베이스를 사용할 때의 또 다른 이점은 예제에서 제공하는 범위 쿼리를 매우 쉽게 만들 수 있으며 입니다. 더 이상 필요하지 않은 오래된 데이터가있을 때마다 데이터베이스에서 삭제하여 공간을 절약 할 수 있습니다.

또한, 매번 전체 파일을 구문 분석 할 필요가 없습니다. pyinotify의 도움으로 파일에 대한 기록을 모니터 할 수 있습니다.이 때 행이 기록되면 데이터베이스의 카운터를 갱신 할 수 있습니다. 또는 파일을 읽을 때마다 파일의 마지막 위치를 저장하고 다음 번에 그 위치에서 읽을 수 있습니다. 파일이 잘리는 경우주의하십시오.

을 요약하면 :

  • 가 (. 예를 들어 매일의 대역폭)
  • 사용 pyinotify 로그 파일에 쓰기를 모니터링하는 일의 해상도로 데이터베이스에 데이터를 저장할 있도록 돈 '는 t이 넘는 전체 파일을 읽고 다시

당신이 당신의 자신의 솔루션을 코딩 Webalizer, AWStats에서 살펴 또는 this list에서 도구를 선택하지 않으려면.

는 편집 :

WebLog Expert도 유망 보인다. reports 중 하나를 살펴보십시오.

1

큰 로그 파일에서 필요한 5 일 데이터 만 가져 오면 구문 분석을 시작하기 전에 파일을 seek() 할 수있는 올바른 시작 오프셋을 찾습니다.

당신은 파일을 통해 이진 검색을 사용하여 해당 위치 각 시간을 찾을 수 : seek()os.stat(filename).st_size/2에, 다음이 개 더 readline()의 작업을 수행, 현재 줄의 끝으로 건너 (결과를 폐기)를 한 번 readline()를 호출합니다. 첫 줄이 원하는 시작 시간 전에 있고 두 번째 줄이 그 뒤에 오는 경우 시작 오프셋은 tell() - len(second_line)입니다. 그렇지 않은 경우 binary search algorithm 표준을 사용하십시오. (찾고있는 줄이 파일에서 처음 또는 마지막이거나없는 경우를 제외하고는 쉽게 추가 할 수 있습니다.)

시작 오프셋을 얻은 후에는 당신이 관심있는 범위보다 새로운 것에 도달 할 때까지 그곳에서부터 파싱 라인을 찾는다.

이것은 매번 전체 로그 파일을 분석하는 것보다 훨씬 빠르지 만, 많은 일을한다면 이 쿼리 중 데이터베이스가 추가 복잡성의 가치가있을 것입니다. 데이터베이스의 크기가 문제가되면 데이터베이스가 로그 파일의 인덱스 인 하이브리드 방식을 사용할 수 있습니다.예를 들어, 데이터베이스의 매일 시작 바이트 오프셋을 저장할 수 있습니다. 5 분마다 데이터베이스를 업데이트하지 않으려면 실행될 때마다 logparse.py에 새 데이터로 업데이트 할 수 있습니다.

결국 Pierre와 the_void가 말했듯이, 당신이 바퀴벌레를 재발 명하지 않도록하십시오 .- 대역폭 통계가 필요한 최초의 사람은 아닙니다 :-)

관련 문제