Рейтинг:0

Чтение журналов в реальном времени с помощью bash

флаг be

В системных логах у меня так:

27 февраля, 02:53:51 Latitude-E6430 rsyslogd: действие до 7
27 февраля, 02:53:51 Latitude-E6430 rsyslogd: действие отключено B
27 февраля, 02:53:51 Latitude-E6430 rsyslogd: исправление U
....и т.д

Я хочу сделать скрипт, который постоянно отслеживает журналы как услугу, но я не знаю, как выполнить условие.

1 - Когда вы читаете, строка за строкой, сохраняете это в переменной.

2 - чтение переменной если он находит в строке слова [rsyslogd] и [7], он показывает [echo "Found" ]

Это был бы цикл, чтобы читать файл построчно, ища этот образец слов.

Пример сценария

path_full_log="/home/full.log"


функция reader_time_real () {

    при чтении full_log; делать
        chek7=$(cat $full_log | grep "rsyslogdd" | grep 7)
            если [[$? = 0 ]]; тогда 
                эхо "Найдено 7";

            фи

        chekB=$(cat $full_log | grep "rsyslogdd" | grep B )
            если [[$? = 0 ]]; тогда 
                эхо "Найден Б";

            фи
    сделано < $path_full_log
}
David avatar
флаг cn
Покажите сценарий, который вы сделали, чтобы кто-нибудь мог увидеть, в чем могут быть ошибки.
BurstBass BurstBass avatar
флаг be
готово... далее вниз
Soren A avatar
флаг mx
Пожалуйста, добавьте свой сценарий к своему вопросу, а не как ответ ... он, вероятно, будет закрыт.
WU-TANG avatar
флаг cn
Разве это не функция rsyslog? Я только настроил сервер syslog-ng, но я думаю, что они достаточно похожи, чтобы оба могли выполнять фильтры ???
BurstBass BurstBass avatar
флаг be
они не совпадают, я указываю в обоих, что он должен иметь слово «rsyslogdd» и 2 возможных варианта, 7 или B
BurstBass BurstBass avatar
флаг be
Исправлено, просто замените `cat $full_log` на `echo $full_log`
Lorenz Keel avatar
флаг gr
@BurstBass BurstBass, если вы его исправили, ответьте сами с окончательной версией сценария, а затем примите свой собственный ответ.
WU-TANG avatar
флаг cn
@BurstBassBurstBass Если ваш ответ был мне (вы никого не отметили), то я думаю, вы неправильно поняли, что я сказал .... Я сказал, что «я думаю», что системный журнал уже имеет встроенную возможность делать то, что ваш скрипт делает. Раньше я настраивал сервер syslog-ng и настраивал фильтры, чтобы ловить слова и отправлять их в отдельный журнал (даже триггерные команды). Я думаю, что rsyslog имеет ту же функциональность.
Рейтинг:1
флаг vn

Я сделал следующий скрипт, который обновляется каждую секунду и выделяет все новые записи журнала. Он также определяет область, в которой должен отображаться журнал (с логроу и логколи переменные), поэтому он создан для использования в окне терминала фиксированного размера (я использую его внутри tmux).

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

#!/бин/баш

# Переменные начальной конфигурации
логарифм = 31
логколс=127

# Определение локальной функции
печатать новый () {
  чистый
  эхо -е "\e[0;30;47м"
  hightail=$(tail -n "$logrows" /var/log/syslog | cut -b "1-$logcols")
  echo -ne "${хайтейл}\e[0m"
}

printdif () {
  (( новые строки = logrows - logdiff ))
  чистый
  normtail=$(tail -n "$logrows" /var/log/syslog | head -n "$newrows" | cut -b "1-$logcols")
  эхо -n "$ нормальный хвост"
  эхо -е "\e[0;30;47м"
  hightail=$(tail -n "$logdiff" /var/log/syslog | cut -b "1-$logcols")
  echo -ne "${хайтейл}\e[0m"
}

printold () {
  чистый
  normtail=$(tail -n "$logrows" /var/log/syslog | cut -b "1-$logcols")
  эхо -n "$ нормальный хвост"
}

# Цикл каждую секунду
пока правда
делать
  спать 1 &

  # Чтение размеров журнала
  logsize=$(wc -l /var/log/syslog | cut -d ' ' -f1)
  (( logdiff = размер журнала - предварительный размер))

  # Если новых строк больше, чем $logrows
  если (( logdiff > "$logrows"))
  тогда
    распечататьновый
    перерисовать=1
  # Если новых строк меньше $logrows, но больше 0 строк
  Элиф (( logdiff > 0 ))
  тогда
    printdif
    перерисовать=1
  # Если нет новых строк
  еще
    если [[ "$redraw" -eq 1 ]]
    тогда
      печатный
      перерисовать=0
    фи
  фи

  presize="$logsize"
  жди # сна
сделано

Сценарий сделан с учетом 3 сценариев:

  1. Все содержимое логроу новая - все выделено(распечататьновый).
  2. Некоторые строки лога новые - они выделены (printdif).
  3. Нет новых строк лога - ничего не выделено (печатный).

Отказ от ответственности: код, вероятно, можно было бы оптимизировать, но я обычно больше беспокоюсь о том, чтобы мой код был читабельным, а не как можно более сжатым.

Рейтинг:1
флаг in

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

Кроме того, у вас есть бесполезное использование кот, ты grep фиксированную строку с шаблоном регулярного выражения и сохраните результат в переменной, которую вы больше не используете. Также вы не должны использовать переменные имени файла без кавычек.


Использовать хвост -f | grep --line-buffered:

хвост -fn0 "$path_full_log" \
| grep -F --line-buffered 'rsyslogdd' \
| grep -Eo --line-buffered '(7|B)' \
| при чтении строки; делать
      echo "Найдена $строка"
  сделано

Или используя xargs:

хвост -fn0 "$path_full_log" \
| grep -F --line-buffered 'rsyslogdd' \
| grep -Eo --line-buffered '(7|B)' \
| xargs -I{} эхо "Найдено {}"
  • хвост -fn0 читает новые строки файла при их добавлении.
  • грэп -F ищет фиксированную строку в этой строке.
  • --line-buffered рассказывает grep читать строки, когда они приходят, вместо того, чтобы ждать окончания входного потока, который используется по умолчанию.
  • grep -Eo ищет ЭРЭ шаблон () (7|Б) и выводит только совпавшую строку ().
  • при чтении строки или же аргументы -I{} берет этот вывод и запускает вашу команду на выходе (здесь: эхо).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.