解析不断增长的日志文件

时间:2009-06-27 21:54:26

标签: ruby logging parsing

我想使用ruby做一个日志文件解析器,这个解析器应该在日志文件增长时解析它。它应该逐行解析直到结束,然后等待(不知怎的?)以获得更多的行,所以我的问题是如何最好地处理它的增长?

编辑: 如果我的日志文件在Windows上(暂时),则更喜欢以便携式方式执行此操作。

3 个答案:

答案 0 :(得分:1)

对于Windows,您可以使用Directory Change Notifications。您告诉Windows(使用FindFirstChangeNotification)监视目录c:/ foo / logs,然后Windows在该目录中发生某些事件时更新您的句柄。此时,您将检查更改是否涉及您关注的文件。

Ruby具有Win32 API的绑定,并且an example获取这些通知。

答案 1 :(得分: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。谷歌了。
  3. 输入以下命令调用我们的脚本。

    脚本“\ LogParser.txt”

  4. 如果您需要使用他们的任何示例脚本,请使用以下命令安装它们。

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

    帕特里克

答案 2 :(得分:0)

对于此任务,您可以使用IO.popen在命令行增长结果的管道上获取文件流。然后在while循环中使用readline函数。 以下是" adb logcat"的示例。获取Android设备的实时日志的命令:

#! /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