Вращение журналов прежде, чем проанализировать их походит на хорошую идею действительно, пока Ваши приложения не сохраняют файл журнала открытым постоянно. Если они делают, поворачивая их работа привычки - но так как Вы пишете платформу журналирования, можно иметь дело с этим.
Если Вы хотите простую вещь в виде сценария, Вы могли бы использовать что-то как следующее (мог быть выполнен в значительной степени любой язык сценариев):
#! /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
получит данные, как введено.
AFAIK, нет никаких инструментов, которые делают и вход и визуализацию одинаково хорошо.
rootsh
и подобные инструменты являются подходящим вариантом для традиционного входа. Так как Ваш вопрос рассматривает визуализацию как важную, и Вы просто регистрируете себя - это - то, на чем фокусируется мой ответ.
TTYRec является терминальной экранной системой записи. Это просто действует как псевдотерминал между Вами и приложением или оболочкой.
Все ниже поддержек ttyrec
формат, таким образом, в теории необходимо смочь к смешиванию и подгонке подойти.
Терминальная запись
script
от .bashrc
.https://github.com/shelr
Другие плееры
Другое программное обеспечение (несовместимый формат)
Другой подход должен был бы использовать экран GNU и сказать Вашей оболочке говорить экран, где зарегистрировать вывод перед каждой командой. Например, с zsh (после того, как запустил экранную сессию):
preexec() {
((cmd++))
{
date +%F-%T
print -r -- "$3"
} > ~/logs/$cmd
screen -X msgminwait 0
screen -X log off
screen -X logfile ~/logs/$cmd
screen -X log on
screen -X msgminwait 3
}
Затем в ~ / журналы, Вы пронумеровали файлы с командами и их выводом.