
Каждый час сервер создает новый файл журнала в формате syslog_all.yyyy-mm-dd-hh и архивирует файл за предыдущий час.
Мне нужен способ поиска определенной строки в текущих и еще не созданных файлах журнала без необходимости перезапускать команду каждый час только потому, что имя файла изменилось.
В настоящее время я занимаюсь:
tail -f syslog_all.2017-04-25-09 | egrep -i --line-buffered "string1" | egrep -i "(.*first.*|.*second.*|.*third.*)"
решение1
Вот рецепт высокого уровня.
- Настройте syslogd или rsyslogd (в зависимости от того, какой из них использует ваша система) для вывода требуемых сообщений о средствах/приоритетах в именованный канал в дополнение к тому, куда они направляются сейчас. Извлечение из
man rsyslog.conf
Named pipes This version of rsyslogd(8) has support for logging output to named pipes (fifos). A fifo or named pipe can be used as a des‐ tination for log messages by prepending a pipe symbol ('|') to the name of the file. This is handy for debugging. Note that the fifo must be created with the mkfifo(1) command before rsys‐ logd(8) is started.
В моем случае есть пример/etc/rsyslog.d/50-default.conf
daemon.*;mail.*;\
news.err;\
*.=debug;*.=info;\
*.=notice;*.=warn |/tmp/rt_monitor
Создайте именованный канал и используйте tail и grep для чтения и поиска в канале.
mkfifo /tmp/rt_monitor; tail -f /tmp/rt_monitor | grep "alert string"
Вам следует проверить, продолжает ли работать система, если именованный канал заполняется, если у вас не запущен потребитель, и предотвратить возникновение этой ситуации. Я дал вам очень верный рецепт.