LINUX.ORG.RU
ФорумAdmin

Распарсить лог файлы

 ,


0

1

Доброй ночи, уважаемые форумчане. Буду неоригинален, надо распарсить несколько лог файлов. Есть сервер, на которые несколько железок сыпят лог. Каждая в свой файл. Обновление информации происходит каждые 15 минут. Т.е. если событий нет, то файл не обновляется. Если есть новые события, то события записываются. Нужно все файлы анализировать на изменение и все новые события записывать в один файл (другой). Каждая строка лога представляет собой след.запись: 2015-09-08 23:06:00 xy1 20002020  — backup error |Charging meters |

Решение видится в поиске файлов измененных в течении последних 15 минут, затем в выборке новых значений в выбранных файлах.

Гугл привел на вот эту тему Парсить лог-файл по дате

Но у меня приведенный пример не заработал.

Нужно все файлы анализировать на изменение

incron

затем в выборке новых значений в выбранных файлах.

Если там не гигабайты, я бы каждый раз лог-файл копировал во временный, а оригинал обнулял. А анализировал потом уже временный.

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

incron как вариант. Найти файлы измененные за последние 15 минут можно несколькими вариантами.

А вот обнулить никак нельзя к сожалению. Логом не только я пользуюсь. Вернее совсем не я. Я хочу с помощью него упростить параллельную задачу. Можно конечно как вариант копировать все файлы и через 15 минут сравнивать измененные. Но мне кажется это не самый правильный вариант.

Zvezdochet_nn ()
Ответ на: комментарий от anonymous

к чему данное сообщение??? Логи пишут удаленные железки. Изменить порядок записи на которых невозможно. Только вкл/выкл логирование.

Zvezdochet_nn ()
Ответ на: комментарий от Zvezdochet_nn

А вот обнулить никак нельзя к сожалению.

если у тебя софт пишущий в лог не закрывает файл то все печально, и надо ковырять софт

если закрывает и автоматом создает новый если старый утащить, то можно просто каждые 15 минут преименовывать старый файл

Deleted ()

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

Гуглить такую тривиальщину — себя не уважать.

kawaii_neko ★★★★ ()
Ответ на: комментарий от Deleted

к сожалению не софт, а железо. Заковырять не получится. Трогать файл нельзя, т.к. его еще используют.

Zvezdochet_nn ()
Ответ на: комментарий от kawaii_neko

найти файлы не проблема. Проблема как достать именно нужные строки, записанные в 15-ти минутный интервал.

Zvezdochet_nn ()

Я что-то не понял про 15 минут. Если тебе несколько логов в 1 слить надо то возьми тот же rsyslog

alozovskoy ★★★★★ ()

Железки по какому протоколу общаются с сервером? Если Syslog, то советую: http://www.fluentd.org/ В нём и распарсишь, и выведешь как тебе надо. (Ввод, кстати, сислогом не ограничен)

spijet ★★★ ()

Инструкция

Для каждого лога:
1. Запоминаешь длину лога

length=$(cat log.log | wc -l)
2. Ждешь 15 минут.
3. Запоминаешь новую длину лога length_new (см. п.1)
3. Сохраняешь все, что дописали во временный файл:
cat log.log | sed -n $length,$length_new\p >> temp.log
4. Придумываешь, как отсортировать temp.log:
man sort
5. Доливаешь temp.log в основной:
cat temp.log >> true.log
6. Запоминаешь длину лога
length=$length_new
7. goto 2
8. Дебажишь это всё
9. ??????
10. PROFIT!

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)

я 5 лет назад накостылил методу, что у меня отдельно хранилась «предыдущая копия лога», я её сравнивал методом:

# определяем является ли новый файл = старый + новые сообщения
# просто сравниваем первые строки
S1=$( head -n 1 $NEWLOGFILE);
S2=$( head -n 1 $OLDLOGFILE);

if [ "${S1}" != "${S2}" ]
then
  echo "LOGFILE WAS ROTATED"
# новый лог не кумулятивный
else.
  oldsize=$(stat -c "%s" $OLDLOGFILE)
  tail -c +$(( $oldsize + 1 ))  $NEWLOGFILE > $DELTA;
fi 

дальше парсил delta-файл. нормально работало пока кол-во файлов не начало быть около 300, а средний размер логфайл на время ротейта 200мб.

bl ★★★ ()
Ответ на: комментарий от bl

Доброй ночи. Появились идеи по реализации. Сможет кто подсказать, что перевести время в каждой строчке в timestamp пример лога: 2015-09-08 23:06:00 xy1 20002020 — backup error |Charging meters |

Zvezdochet_nn ()
Ответ на: комментарий от Zvezdochet_nn
~ $ echo '2015-09-08 23:06:00 xy1 20002020  — backup error |Charging meters |' |
> { read A B C ; date -d "${A} ${B}" +%s ; }
1441742760

если у тебя 'date' из GNU coreutils.

ABW ★★★★★ ()
Ответ на: комментарий от Zvezdochet_nn

Поставь fluentd и не ломай себе мозги. Он умеет парсить timestamp'ы всех популярных форматов. А если надо - напишешь regexp.

spijet ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.