2009-06-27 7 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に投稿された良いスクリプトがあります。 Webサーバーのログ用に作成されたサンプルスクリプトですが、任意の種類のログ用に独自のログパーサーを作成するための出発点として使用できます。連続的に使用するには、ログファイルが増加し続けている間、ここにスクリプトがあります。

# 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。 Googleはそれをアップ。
  3. 次のコマンドを入力して、スクリプトを呼び出します。あなたはそれらのサンプルスクリプトのいずれかを使用する必要がある場合は、次のコマンドでそれらをインストール

    スクリプト「\ LogParser.txt」

。パトリック

0

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

は、この作業のためには、コマンドラインの成長結果のパイプ上のファイルストリームを取得するためにIO.popenを使用することができます。その後、whileループでreadline関数を使用します。 はここでAndroidデバイスのライブ成長のログを取得する「のadb logcat」コマンドを使用して、一例です。ファイルの場合

#! /usr/bin/env ruby 

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

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

EDIT

、それは少し異なっています。私はファイルストリームのポーリングで "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 
関連する問題