Поиск: grep, find, journalctl

Как искать в логах и файловой системе, не перебирая руками.

grep

grep -i error app.log          # без учёта регистра
grep -r "TODO" src/            # рекурсивно по каталогу
grep -n "panic" app.log        # с номерами строк
grep -c "error" app.log        # сколько раз встретилось
grep -v "healthcheck" app.log  # всё, КРОМЕ совпадений

Самые полезные в разборе инцидента — контекстные флаги:

grep -A5 "error" app.log    # 5 строк после
grep -B5 "error" app.log    # 5 строк до
grep -C5 "error" app.log    # по 5 с обеих сторон

Строка с ошибкой почти никогда не объясняет причину — она в строках вокруг, особенно в стектрейсе.

find

find /var/log -name "*.log"            # по имени
find /var/log -mtime -1                # изменённые за сутки
find /var/log -size +100M              # больше 100 МБ
find /tmp -type f -mtime +7 -delete    # удалить старое

find пригождается, когда кончилось место: он находит, что именно выросло, а не просто показывает, что диск полон.

du -h --max-depth=1 /var | sort -h

journalctl

На системах с systemd логи чаще смотрят не в файлах:

journalctl -u nginx              # логи одного юнита
journalctl -u nginx -f           # следить в реальном времени
journalctl -u nginx --since "1 hour ago"
journalctl -p err -b             # только ошибки с последней загрузки

-p err фильтрует по приоритету и очень экономит время: в загруженной системе информационных сообщений на порядки больше, чем существенных.

Собираем вместе

Найти, какие IP чаще всего получали 500-е за последний час:

grep " 500 " access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head

Связка sort | uniq -c | sort -rn — самый частый приём разбора логов: uniq -c считает только соседние одинаковые строки, поэтому сортировка перед ним обязательна.