2009-06-27 8 views
4

ruby를 사용하여 로그 파일 파서를 만들고 싶습니다.이 파서가 커지는 동안 로그 파일을 구문 분석해야합니다. 그것은 끝날 때까지 라인마다 구문 분석해야하고 기다리는 (어쨌든?) 더 많은 라인을 올 수 있도록, 내 질문에 어떻게 성장을 최상으로 처리하는 것입니다?증가하는 로그 파일 구문 분석

편집 : 내 로그 파일이 Windows에 있더라도이 휴대용 방식을 선호합니다.

답변

1

Windows의 경우 Directory Change Notifications을 사용할 수 있습니다. Windows에 (FindFirstChangeNotification으로) 디렉토리 c :/foo/logs를 모니터하도록 말하면, Windows는 그 디렉토리에서 어떤 일이 발생했을 때 핸들을 갱신합니다. 이때 변경 사항에 관심이있는 파일이 포함되어 있는지 확인합니다.

Ruby에는 Win32 API 바인딩이 있으며이 알림을 가져 오는 데는 an example이 있습니다.

0

http://www.biterscripting.com/SS_WebLogParser.html에 게시 된 좋은 스크립트가 있습니다. 이 스크립트는 웹 서버 로그 용으로 작성된 샘플 스크립트이지만 모든 종류의 로그에 대해 자체 로그 파서를 작성하는 시작점으로 사용할 수 있습니다. 지속적으로 사용하려면 로그 파일이 계속 커지는 동안 여기 스크립트가 필요합니다.

# Script LogParser.txt 
# Go in a continuous loop, sleeping 1 hr each time. 
while (true) 
do 
    # The number of lines in the log file the last time we checked is in following 
    # variable. Initially, it will be 0. 
    var int lines_old 

    # Read the log file into a str variable. 
    var str log ; cat "file.log" > $log 

    # Get the number of lines found this time. 
    var str lines_new ; set $lines_new = { len -e $log } 

    # Strip off the first $lines lines. 
    lex -e (makestr(int($lines))+"]") $log > null 

    # The new lines are now available in $log. Process them with something similar to 
    # SS_WebLogParser script. 

    # Update $lines_old, then, sleep. 
    set $lines_old = $lines_new 
    sleep 3600         # 3600 seconds = 1 hour 
done 

시도하려면,

  1. 저장 C, 말,로이 스크립트 : \ LogParser.txt (당신이 창에 있기 때문에).
  2. 다운로드 biterscripting. 그것까지 구글.
  3. 다음 명령을 입력하여 스크립트를 호출하십시오.

    스크립트 "\ LogParser.txt"

당신이 자신의 샘플 스크립트 중 하나를 사용하여 다음 명령으로 설치해야하는 경우

. 패트릭

0

script "http://www.biterscripting.com/Download/SS_AllSamples.txt" 

이 작업을 위해 당신은 명령 라인의 성장 결과의 파이프에서 파일 스트림을 얻을 수 IO.popen를 사용할 수 있습니다. 그런 다음 while 루프에서 readline 함수를 사용하십시오. 가 여기에 안드로이드 장치의 라이브 성장 로그를 얻을 "ADB 로그 캣"명령을 예입니다 : 파일에 대한

#! /usr/bin/env ruby 

IO.popen("adb logcat") do |io| 
    while line = io.readline 
     line.strip! 

     # Process here 
     print "#{line}\n" 
    end 
end 

편집

, 그것은 조금 다르다. 필자는 파일 스트림을 폴링 할 때 "readline"을 사용합니다.

#! /usr/bin/env ruby 

File.open("test.log") do |io| 
    loop do 
     begin 
      line = io.readline 
      line.strip! 
     rescue 
      sleep 0.2 
      retry 
     end 

     # Process here 
     print "#{line}\n" 
    end 
end