запуск с последней строки, обработанной при обработке файла журнала несколько раз

Я бросаю вызов Вам настраивать безопасную почту, файл и веб-серверы. Это помогает?

Кажется, что Вы сделали хорошее задание предложения Ваших собственных проблем. Сделайте их сначала, затем думайте о чем-то новом. Промывка, повториться.

2
19.04.2011, 19:24
1 ответ

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

Если Вы хотите простую вещь в виде сценария, Вы могли бы использовать что-то как следующее (мог быть выполнен в значительной степени любой язык сценариев):

#! /bin/bash

process_line() {
    # do the work here
    echo "== $1 =="
}

logfile=$1
statefile=${logfile}.state

if [ -f ${statefile} ] ; then
    processed=$(cat $statefile)
else
    processed=0
fi

curline=0
IFS='
'

while read line ; do
    if [ $curline -ge $processed ] ; then
        echo processing $line
        process_line "$line"
    fi
    curline=$(($curline+1))
done < ${logfile}

echo $curline > $statefile

В основном это копит туда, где это обработало вход в отдельном файле ($statefile), и процессы вход линию за линией от той точки (пропускающий уже обработанные).

Этому было бы нужно немного больше обработки ошибок, очевидно, и если вход является большим, это не оптимально. (Мог быть сделан лучше путем сохранения байтового смещения и поиска или использования dd bs=1 skip=$already_read count=$(($size-$already_read)) для передачи по каналу к другому процессу вместо того, чтобы делать вещи линию за линией но я пошел бы с perl если такая оптимизация необходима.)

Как это, сценарий будет производственные линейки дважды, если это будет прервано. Можно ограничить сумму "воспроизведения" путем обновления файла состояния после каждой строки, а не однажды в конце.

Если Вы оба обработаете журналы и повернете их, то необходимо будет быть осторожными с теми файлами состояния. Они должны были бы быть повернуты также, и скрипт, запущенный однажды после вращения для обработки последних строк вывода.

Существует одна вещь, с которой не имеет дело этот подход легко: частичные строки. Если приложение пишет, в то время как сценарий работает, существует шанс, что сценарий будет видеть частичную последнюю строку. Это не сможет сказать различие, таким образом, это запишет его как обработанный. (Это - проблема, с которой необходимо будет иметь дело с в значительной степени любым подходом.)

Этого можно было избежать при наличии маркера EOL в Вашем формате файла журнала и проверки это прежде, чем обработать строку. Но это не очень симпатично.

Вместо того, чтобы выполнять в обработке bash в самом сценарии Вы могли использовать его как это (замена process_line с плоскостью echo):

$ ./logger /var/log/app12.log | ./analyzer --logtype=app12

./analyzer получит данные, как введено.

2
27.01.2020, 22:15

Теги

Похожие вопросы