Логи Vanilla-операции YTsaurus Flow
Логи
Процессы Flow живут в джобах vanilla-операции, поэтому их логи пишутся в песочницу джобы: подробная история процесса — в файле logs/flow.log и, с обрезкой по размеру, в stderr джобы. По умолчанию раннер настраивает логирование так:
- файл
logs/flow.logсжимается zstd — и активный сегмент, и ротированные. Активный сегмент ротируется по достижении256 MiBна диске, то есть уже в сжатом виде (max_segment_size); все сегменты вместе занимают не более4 GiB(max_total_size_to_keep), самые старые сверх лимита удаляются. История поэтому длинная, но не бесконечная: у долго работающего пайплайна её начало вытесняется. Уровеньinfoи выше; шумные инфраструктурные категории (Bus,Concurrency,RpcClientи другие) исключены, чтобы бюджет уходил на историю пайплайна; - тот же поток уровня
info(плюсerrorисключённых категорий) пишется и вstderrджобы — он доступен со страницы операции в UI YTsaurus. YTsaurus хранит из него не большеmax_stderr_size(по умолчанию5 MiB): начало и конец потока, то есть запуск процесса и последние события перед завершением; середина у долго работающей джобы вытесняется.
Посмотреть logs/flow.log живой джобы можно через job shell; <job_id> берётся со страницы vanilla-операции (задачи controller и worker):
yt --proxy <cluster> run-job-shell <job_id>
Файл сжат, поэтому tail и grep по нему напрямую не работают — читать его нужно через zstd-декомпрессор. Это обычный поток zstd-фреймов, который понимает любой стандартный декомпрессор:
# внутри джобы: хвост активного сегмента
zstd -dc logs/flow.log | tail -n 100
Так виден только активный сегмент, а в нём — не больше 256 MiB истории. Остальное лежит в ротированных сегментах рядом, в том же каталоге logs/: при каждой ротации активный flow.log становится flow.log.1, прежний flow.log.1 — flow.log.2 и так далее, а под именем flow.log открывается новый пустой файл. Поэтому flow.log — всегда самый свежий сегмент, а чем больше номер, тем сегмент старее. Номера дополняются нулями до общей ширины (flow.log.01, flow.log.02, … когда сегментов больше девяти), так что порядок имён совпадает с числовым — и обратный порядок имён даёт сегменты от самого старого к активному:
# внутри джобы: вся сохранённая история, от старых записей к новым
ls -r -1 logs/flow.log* | xargs zstd -dc
Утилиты zstd в джобе может не оказаться: набор утилит определяется образом задачи. Если её нет, добавьте слой с ней через layers или system_layer_path задачи — см. Дополнительные параметры.
Уровень и состав логирования переопределяются через node_config-патч в блоке vanilla, секция logging — см. TLogManagerConfig.
Логи завершившихся джоб
Песочница джобы удаляется вместе с джобой, поэтому от завершившейся джобы остаётся только её stderr — он есть у упавших и штатно завершившихся джоб; у джобы, убитой при отмене операции, stderr может не сохраниться. Раннер по умолчанию задаёт в спецификации операции max_stderr_count = 150 (максимум планировщика), поэтому планировщик хранит stderr первых 150 завершившихся джоб операции, а не только первых десяти; значение переопределяется полем max_stderr_count блока vanilla. Возьмите <operation_id> со страницы Vanilla-операции, а <job_id> — из её задачи controller или worker; затем прочитайте сохранённый лог командой:
yt --proxy <cluster> get-job-stderr --operation <operation_id> --job-id <job_id>