Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСофт и программы

Разбор логов: чем смотреть, когда файл вырос до гигабайта

sysdiag
sysdiag
Знаток
сообщений 1975
с фев
15 ноября, 14:22первое сообщение

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

Первый же grep по нему думал четыре минуты. Так работать нельзя. Чем вы разбираете такие файлы и как потом не доводите до гигабайта?

логи читаю раньше почты
grepwalker
grepwalker
Знаток
сообщений 1330
с мая
22 апреля, 17:39#2

Четыре минуты у тебя съел разбор кодировки, сам поиск тут ни при чём. Попробуй так и удивись:

LC_ALL=C rg -F 'timeout' progon.log | wc -l

Простая подстановка LC_ALL=C убирает разбор многобайтных символов, а -F отключает разбор шаблона. На гигабайте разница у меня выходила семикратной. Плюс не зови cat file | grep, лишний проход через трубу на таких объёмах слышно.

Дальше по времени: если строки начинаются с отметки времени, отказы раскладываются по минутам одной командой и сразу видно провал.

Вика Сорокина
Вика Сорокина
Новичок
сообщений 85
с июл, второй сезон
1 сентября, 08:56#3

а какой командой? я такое только глазами умею

hexdump
hexdump
Знаток
сообщений 940
с июн
8 февраля, 11:13#4

Вика Сорокина, вот такой, счёт по минуте:

LC_ALL=C rg -F 'timeout' progon.log | cut -c1-16 | uniq -c | sort -k1 -rn | head

Теперь важное, о чём почти никто не думает. Лог прогона отсортирован по времени, потому что пишется подряд. Значит по нему работает поиск делением пополам, и вместо гигабайта вы читаете сотню килобайт.

# найти байтовое смещение первой строки после 03:40
awk -v t="03:40" 'substr($0,12,5) >= t { print NR; exit }' progon.log
# и дальше работать куском
sed -n '4180000,4260000p' progon.log > kusok.log

С awk на гигабайте тоже долго, поэтому у себя я держу мелкий скрипт, который прыгает по файлу через seek, читает по строке и сужает границы. Гигабайт он проходит за двадцать шагов, это доли секунды.

И про хранение сразу: складывайте старое zstd, у него ratio на текстовых логах около десятки, а rg -z ищет прямо внутри сжатого. Гигабайт превращается в сотню мегабайт, поиск замедляется процентов на тридцать, места экономится вдесятеро.

sysdiag
sysdiag
Знаток
сообщений 1975
с фев
15 июля, 14:30#5
hexdump: лог прогона отсортирован по времени, значит по нему работает поиск делением пополам

Стыдно признаться, до такого сам не додумался ни разу за все годы работы с логами. Гоняю полный проход там, где хватило бы двадцати чтений.

логи читаю раньше почты
loginless
loginless
Новичок
сообщений 130
с мая, второй сезон
22 декабря, 17:47#6

плюсую zstd, у меня архив логов за полгода влез в объём одной недели

Наиль Габдуллин
Наиль Габдуллин
Знаток
сообщений 1885
с мар
1 мая, 08:04#7

Про «не доводить до гигабайта» отвечу отдельно, тут нужен logrotate по размеру. Суточная нарезка тут проигрывает:

/var/log/progon/*.log {
    size 200M
    rotate 14
    compress
    compresscmd /usr/bin/zstd
    compressoptions -19 -T0
    dateext
    dateformat -%m%d-%s
    missingok
    notifempty
}

Ключевое место тут size, потому что ночной прогон за одну ночь пишет больше, чем дневная работа за неделю, и суточная нарезка даёт файлы разной толщины. И не ставьте copytruncate бездумно: между копией и обрезанием файла теряются строки, а на активной записи это заметно.

разбираю чужие конфиги за печенье
Артур Вагнер
Артур Вагнер
Знаток
сообщений 1290
с мая
8 октября, 11:21#8

Добавлю сбоку: если лог пишете вы сами, пишите его в json по строке на запись. Тогда разбор перестаёт быть игрой в регулярки.

rg -F '"status":429' progon.jsonl | jq -r '.ts' | cut -c12-16 | uniq -c

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

конфиг без комментария это загадка
grepwalker
grepwalker
Знаток
сообщений 1330
с мая
15 марта, 14:38#9

Артур Вагнер, поддерживаю. Ещё удобно, когда в каждой строке лежит номер задания: потом достаёшь всю судьбу одной страницы одним поиском.

sysdiag
sysdiag
Знаток
сообщений 1975
с фев
22 августа, 17:55#10

Прогнал замеры на своём файле, разложил по способам.

один и тот же поиск, разные способы
один и тот же поиск, разные способы

Тридцать одна секунда против четырёх минут, и это на голом месте.

логи читаю раньше почты
hexdump
hexdump
Знаток
сообщений 940
с июн
1 января, 08:12#11

Отметь ещё, что rg по умолчанию читает файл параллельно, только когда их несколько. На одном файле упор идёт в диск, поэтому на сетевой шаре разница будет скромнее.

Вика Сорокина
Вика Сорокина
Новичок
сообщений 85
с июл, второй сезон
8 июня, 11:29#12

скопировала себе все команды из темы, спасибо огромное

sysdiag
sysdiag
Знаток
сообщений 1975
с фев
15 ноября, 14:46#13

Итог по мне: LC_ALL=C с -F дали основной выигрыш, деление пополам по времени закрыло разбор ночных провалов, logrotate по размеру больше не даёт файлам расти.

Скрипт с прыжками по файлу перепишу и выложу отдельной темой, там пары десятков строк хватает.

логи читаю раньше почты