Написание скрипта bash для получения конкретной строки из мониторинга Stackdriver - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь запустить скрипт bash, чтобы получить определенную строку из журналов Stackdriver, если она найдена, то она должна завершиться или в течение 5 минут бездействовать, а затем повторить попытку, получив текущую дату из переменной среды и затем примените его, если он не найден со второй попытки, то он должен завершиться неудачей.

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

CHIEF=$(date +%Y-%m-%dT%H:%M:%S.000Z)

Команда, которую я использую для потоковой передачи журналов:

gcloud logging read "logName=projects/testing1/logs/syslog timestamp>=\"2019-09-25T10:55:56.992Z\" AND timestamp<=\"$CHIEF\""

Допустим, я хочу извлечь журнал «Отказано в доступе». Как я могу создать этот скрипт bash, пожалуйста?

Спасибо

1 Ответ

2 голосов
/ 30 сентября 2019

Ознакомьтесь с документацией по ведению журнала Stackdriver, она приличная: https://cloud.google.com/logging/docs/view/overview

Я рекомендую попробовать ваши запросы с помощью средства просмотра Google Cloud Logging: https://console.cloud.google.com/logs/viewer

Переключить запрос в расширенный режим,Это поможет получить нужный фильтр.

Ваш фильтр должен ограничивать журналы не только журналом и отметкой времени, но и конкретным значением Access Denied. Мне неясно, где это может появиться в вашем системном журнале, но программа просмотра журналов должна помочь вам сузить это.

Затем вы можете применить формат, встроенный в gcloud --format=... или, для более общего назначения --format=json и затем перенаправить результат, например, в jq.

Это один из способов решения вашей проблемы. Я не даю никаких гарантий, что это лучший способ; -)

FILTER="logName=\"projects/testing1/logs/syslog\" "\
"jsonPayload.message:\"Access Denied\" "\
"timestamp>=\"2019-09-25T10:55:56.992Z\" "

for LOOP in first second;
do
  CHIEF=$(date +%Y-%m-%dT%H:%M:%S.000Z)
  MESSAGE=$(\
    gcloud logging read "${FILTER} AND timestamp<=\"$CHIEF\""" \
    --format="value(jsonPayload.message)")
  if [ "${MESSAGE}" == "Access Denied" ]; then
    echo ${MESSAGE}
    break
  fi
  sleep 5m;
done

** NB *

  • FOR loop in first second громоздко, но работает
  • Payвнимание при объединении строк фильтра, это становится грязным.
  • Вы должны (!?) иметь возможность использовать CHIEF=$(date --rfc-3339=s)
  • Я использую jsonPayload.message и : (содержит |has) для значения
  • Я использую --format=value(...), но есть и другие способы форматировать
  • Это предполагает, что jsonPayload.message это только Access Denied. Это маловероятно, вам следует выполнить проверку регулярных выражений или подстрок

HTH!

...