1

Я хочу контролировать nginx access.log на предмет некорректных запросов и уведомлять себя о таких случаях.

Для этого я написал следующую команду:

tail -n0 -f access.log | grep --line-buffered '\{' | xargs sentry-cly -m

Но это решение не работает по какой-то причине. Если я удаляю последний канал и заканчиваю только grep - я увижу вывод, поскольку файл журнала получит новые записи.

Я не понимаю, почему Xargs не выполняется. То же самое будет, если вы замените sentry-cli на cat или echo.

Не могли бы вы уточнить, почему у меня такое поведение?

2 ответа2

1

После некоторого дальнейшего исследования я обнаружил, что работает следующее решение:xargs -L 1 .

1

По умолчанию xargs собирает входные данные до тех пор, пока не получит столько, сколько сможет безопасно перейти к одному вызову утилиты (в данном случае sentry-cly -m). Это означает, что он будет ждать, пока не увидит большое количество сообщений журнала, а затем запустит sentry-cly -m first message second message third message ... thousandth message ... Чтобы избежать этого, используйте xargs -L1 sentry-cly -m - -L1 говорит ему запускать sentry-cly -m для каждой строки, которую он читает (т.е. для каждого сообщения).

(Точно так же xargs -L2 sentry-cly -m будет ждать, пока не получит 2 сообщения, затем запустит sentry-cly -m "firstmessage" "secondmessage" , затем дождется следующих двух ... Вы можете увидеть это, запустив xargs -L2 echo , а затем набрав в нем строки и посмотрев, что будет отражено, когда.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .