Отфильтруйте журнал и отправьте результат в новый файл в режиме реального времени

#linux #bash #date #logging #centos

Вопрос:

У меня есть файл журнала «Apps.out» приложения для веб-блога, есть конкретное приложение, которое отправляет такие журналы в этот файл:

 [YYYY/MM/DD HH:MM:SS][INFO][PATTERN -> Information1]
[YYYY/MM/DD HH:MM:SS][INFO][PATTERN -> Information2]
[YYYY/MM/DD HH:MM:SS][INFO][PATTERN -> Information3]
[YYYY/MM/DD HH:MM:SS][INFO][PATTERN -> Information4]
[YYYY/MM/DD HH:MM:SS][INFO][PATTERN -> Information5]
 

Я могу отфильтровать эту информацию с помощью: grep ‘PATTERN’ Apps.out
, но я хочу отправить эту информацию в новый файл (app1.log) и сделать это прогрессивно, просто чтобы отправить новый регистр в app1.log, соответствующий ШАБЛОНУ, возможно ли это сделать в режиме реального времени?
Спасибо

Ответ №1:

Вы можете сделать это с помощью tail -f :

nohup bash -c "tail -f Apps.out | grep PATTERN > app1.log" amp;

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

Вы можете изменить это -n и вернуться на столько строк, сколько захотите, или прочитать с самого начала файла.

Комментарии:

1. Привет, один вопрос, для этого мне нужно, чтобы терминал был постоянно открыт, верно?

2. Вы можете использовать nohup, чтобы покинуть терминал или какую-либо услугу

3. поскольку вы ответили первым, отредактируйте свой ответ, добавив nohup, и я дам вам право голоса 🙂

4. достаточно справедливо :-). Выполнено

5. Привет, у меня ошибка с»>», я пробовал, но это не работает

Ответ №2:

вот что вы можете сделать : <your_log_file> в качестве файла журнала и <your_PATTERN> в соответствии с вашим ШАБЛОНОМ

 nohup tail -f <your_log_file>.log|while IFS= read -r;do
    case $REPLY in
        (*<your_PATTERN>*)printf "%sn" "$REPLY">>app1.log;
    esac
done amp;
 

Комментарии:

1. Привет, этот, похоже, работает, но я не знаю, почему, когда я закрываю консоль, она перестает работать через 2 м