Разбор растущего файла журнала - PullRequest
4 голосов
/ 28 июня 2009

Я хочу сделать анализатор файла журнала, используя ruby, этот анализатор должен анализировать файл журнала по мере его роста. Он должен анализировать построчно до конца, а затем ждать (как-нибудь?), Чтобы появилось больше строк, поэтому мой вопрос заключается в том, как лучше всего справиться с его ростом?

редактирование: Я предпочел бы переносной способ сделать это, даже если мой файл журнала находится на Windows (на данный момент).

Ответы [ 3 ]

1 голос
/ 28 июня 2009

Для Windows вы можете использовать Уведомления об изменении каталога . Вы указываете Windows (с FindFirstChangeNotification ) контролировать каталог c: / foo / logs, затем Windows обновляет ваш дескриптор, когда что-то происходит в этом каталоге. В этот момент вы проверяете, касается ли изменение файла, который вам небезразличен.

В Ruby есть привязки для Win32 API, и есть пример получения этих уведомлений.

0 голосов
/ 17 ноября 2015

Для этой задачи вы можете использовать IO.popen, чтобы получить поток файлов на конвейере растущего результата командной строки. Затем используйте функцию readline в цикле while. Вот пример с командой «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

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
0 голосов
/ 28 июня 2009

Хороший скрипт размещен на 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. Скачать битерскрипт. Google это вверх.
  3. Вызовите наш скрипт, введя следующую команду.

    скрипт "\ LogParser.txt"

Если вам нужно использовать какой-либо из их примеров сценариев, установите их с помощью следующей команды.

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

Patrick

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...