rubyを使用してログファイルパーサーを実行したい場合、このパーサーはログファイルが大きくなると解析する必要があります。それは終わりまでラインごとに解析し、待っている(どういうわけか?)来るべきもっと多くの行があるので、私の質問は成長するのをどのように処理するのかです。成長するログファイルの解析
編集: 私のログファイルがWindows上にあっても、これを実行するためのポータブルな方法が好ましいでしょう。
rubyを使用してログファイルパーサーを実行したい場合、このパーサーはログファイルが大きくなると解析する必要があります。それは終わりまでラインごとに解析し、待っている(どういうわけか?)来るべきもっと多くの行があるので、私の質問は成長するのをどのように処理するのかです。成長するログファイルの解析
編集: 私のログファイルがWindows上にあっても、これを実行するためのポータブルな方法が好ましいでしょう。
Windowsの場合、Directory Change Notificationsを使用できます。 Windowsに(FindFirstChangeNotificationで)ディレクトリc:/ foo/logsを監視するように指示すると、Windowsはそのディレクトリで何かが発生したときにハンドルを更新します。その時点で、気になるファイルが変更に含まれているかどうかを確認します。
RubyにはWin32 APIのバインディングがあり、これらの通知を受け取るのはan exampleです。
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
しようとする、
次のコマンドを入力して、スクリプトを呼び出します。あなたはそれらのサンプルスクリプトのいずれかを使用する必要がある場合は、次のコマンドでそれらをインストール
スクリプト「\ LogParser.txt」
。パトリック
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