2016-05-23 8 views
2

Привет Я пытаюсь использовать журналы доступа apache и копировать ошибки в другой файл. Я попробовал ниже параметры, и все они работают в командной строке, но при запуске из сценария они не работают.Сервер grep apache 500 ошибок для отдельного файла

Я понимаю, что команда хвоста не выходит и поэтому нет выхода. Но не уверен, как это преодолеть.

/usr/bin/tail -f /apps/apache/logs/access_log | grep -h "HTTP\/1.1\" 50." >> /tmp/log_error_capture.txt 
grep -m 1 "HTTP\/1.1\" 50." <(tail -f /apps/apache/logs/access_log) 
(tail -f -n0 /apps/apache/logs/access_log &) | grep -q "HTTP\/1.1\" 50." > /tmp/log_error_capture.txt 
tail -f logfile |grep -m 1 "HTTP\/1.1\" 50." | xargs echo "" >> logfile \; 

Может кто-нибудь предложить лучший способ для grep ошибок. Пожалуйста.

+1

попробуйте добавить параметр «-line-buffered» в grep. – anishsane

+0

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

+1

Если вы хотите, чтобы 'tail -f'you не * хотел * команду для выхода. Если вы просто хотите grep файлы на данный момент, вам не нужен хвост, просто grep. Возможно, вы хотите создать фон с '&'? Просьба уточнить. – tripleee

ответ

3

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

tail -f access_log | grep "HTTP/1\.[01]\" 50." >> /tmp/log_error_capture.txt & 

Кстати, я удалил обратную косую черту перед косой чертой (слэш не является регулярное выражение особенного, поэтому не требуют экранирования) и добавил один перед dot (где выполняется противоположное), а также обновлено выражение для принятия HTTP/1.0, а также 1.1. (Я тоже иногда видел 0,9, но я думаю, что это просто тестирование и/или незначительное в любом случае.) Кроме того, поскольку grep читает стандартный ввод, опция -h была бесполезной, поэтому я удалил ее.

Это будет продолжаться, но не приведет к чему-либо полезному, когда файл журнала будет повернут. Возможно, вы хотите сохранить PID и перезапустить его как часть скрипта вращения журнала; или, возможно, вы просто хотите запустить grep один раз при вращении журнала, вместо того, чтобы он продолжал измельчать в фоновом режиме.

В качестве альтернативы вы можете использовать tail --follow=name, чтобы продолжать работать даже во время логарифмических поворотов. Для производственной системы вы все равно должны выяснить, как справиться с вращением журнала для этого скрипта (например, как и когда поворачивать файл с ошибками 50x).

+0

Hi Triplee, мне интересно, что вышеупомянутое перенаправление к файлу не работает, я пробовал некоторые общие переадресации, и все работает нормально, но вышеупомянутый работает только тогда, когда я grep его без перенаправления вывода: ((. –

+0

http://stackoverflow.com/questions/30787575/using-tail-f-on-a-log-file-with-grep-in-bash-script?rq=1 Здесь larsks упомянул, что он не будет работать Я думаю, что то же самое происходит для меня. –

+0

Ниже приводится окончательный результат. хвост -f/apps/apache/logs/access_log | grep -line-buffered "HTTP/1 \. [01] \" 50."| при чтении строки do echo $ line >> /tmp/log_error_capture.txt done –