Поиск: 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 считает только соседние одинаковые строки, поэтому сортировка перед ним обязательна.