y83 code / справочник

Логи

Раздел «Логи» показывает, что приложение делало и что у него не получалось. Здесь два журнала — основной и журнал VPN, — разобранные на категории и уровни, с поиском, фильтрами и живым обновлением. Экран нужен, когда что-то сломалось и надо понять, где именно.

раздел
Подсистемы приложения
пунктов возможностей
34
источник
docs/about/logs.md

Логи читаются прямо из файлов приложения. Никакой серверной части посередине нет: приложение открывает свой файл и показывает хвост.

Возможности

  • Переключатель источника двумя чипами: App и VPN. У каждого свой файл, смешивать их нельзя — иначе в истории VPN теряются строки основного журнала.
  • Сводка сверху с числом видимых записей и тремя счётчиками: сколько ошибок, сколько предупреждений, сколько обычных записей.
  • Время последнего обновления в той же сводке.
  • Фильтр по уровню четырьмя чипами: «всё», ошибки, предупреждения и обычные записи. Повторный тап по активному чипу снимает фильтр.
  • Поиск по тексту записи, по её исходной строке или по названию категории, без учёта регистра.
  • Фильтр по категории отдельным списком чипов, у каждого — значок и число записей. Повторный тап тоже снимает выбор.
  • Кнопка сброса фильтров в заголовке панели фильтров. Появляется, только когда что-то действительно выбрано, и возвращает уровень, категорию и поиск к состоянию «всё».
  • Кнопка очистки поиска справа в поле поиска — только когда там есть текст.
  • Список // entries с числом отфильтрованных записей в заголовке.
  • Кнопка копирования у заголовка списка — весь отфильтрованный список в буфер обмена. Появляется, только когда в списке есть хоть одна запись.
  • Карточка записи с уровнем, категорией и временем.
  • Кнопка копирования у каждой записи — только она.
  • Раскрытие записи тапом — показывает исходную строку целиком под меткой // raw. Обычно запись обрезана тремя строками.
  • Кнопка паузы в шапке — останавливает и возобновляет живое обновление.
  • Кнопка обновления в шапке — перечитать лог немедленно.
  • Кнопка сохранения в шапке — выгрузить весь файл целиком в папку «Загрузки».
  • Три разных пустых состояния с разными подсказками: записей ещё нет, записи не читаются, ничего не найдено под фильтры.
  • Живой режим с автообновлением, который замирает, пока экран не на виду.

Технические данные

ПараметрЗначение
Источников2: App и VPN, у каждого свой файл
Глубина чтения за разпоследние 500 строк
Интервал живой проверки2 секунды
Перечитывание файлатолько если размер изменился
Размер, после которого лог очищается512 КБ
Категорий10, перечислены ниже
Уровней3: ERROR, WARNING, INFO
Поиск учитывает регистрнет
Сколько строк читает агент за раздо 2000, с пролистыванием вглубь
На этом устройстве сейчасосновной лог около 197 КБ и 1826 строк
Лог VPN сейчасоколо 88 КБ и 1114 строк
Сейчас в основном логепочти всё — записи чата

Как читать карточку записи

Слева значок и слово уровня, потом название категории, справа время и кнопка копирования:

  • ERROR — красный. Что-то упало: слово fail, error, crash или exception в тексте.
  • WARNING — жёлтый. Слово warn, retry или timeout.
  • INFO — обычный цвет. Всё остальное, даже если запись выглядит тревожно.

Уровень ставится по словам в тексте, а не по мнению системы. Поэтому запись с проблемой, в которой нет ни одного из этих слов, попадёт в INFO — и наоборот, любая запись со словом error станет ошибкой, даже если это просто упоминание чужой ошибки в разговоре.

Категория ставится по маркеру в начале сообщения: codex: — чат, codex-ws — его соединение, backend — серверная часть, webai — веб-ИИ, [vpn] — VPN, update: — обновления, а также маркеры сети, файлов и чатов opencode. Всё нераспознанное попадает в Other.

Если маркер в коде поменяют, записи начнут падать в Other — это видно по счётчикам у чипов и чинится правкой маркера, а не настройкой экрана.

Что значит каждый фильтр

Фильтры складываются: источник плюс уровень плюс категория плюс поиск. Пустое значение по любому из них означает «не ограничивать».

Поиск ищет сразу в трёх местах: в разобранном сообщении, в исходной строке записи и в названии категории. Поэтому запрос codex найдёт и записи чата, и те, что помечены категорией Codex, даже если слова codex в тексте нет.

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

Счётчики отсортированы по убыванию: самая частая категория всегда сверху, а при равных числах — по алфавиту.

Про живую паузу

Каждые две секунды экран смотрит на размер файла. Если размер не изменился — ничего не перечитывает, это почти ничего не стоит. Если изменился — читает хвост заново и пересобирает список.

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

Про то, что старые записи исчезают

Это самое важное ограничение экрана. Когда файл лога перерастает 512 килобайт, он не переименовывается в архив, а просто очищается целиком. Дальше пишется новый.

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

Второй важный момент: экран берёт только последние 500 строк. Даже если файл меньше мегабайта, записи старше 500-й с конца в списке не появятся, а перелистать глубже на экране нельзя.

Про выгрузку файла

Кнопка сохранения в шапке копирует весь файл целиком — не то, что сейчас видно на экране, а всё содержимое, включая то, что не влезло в 500 строк.

Копия кладётся в папку «Загрузки» рядом с обновлениями приложения, и путь показывается коротким сообщением. Если выгрузка не удалась, будет написано об этом — обычно из-за нехватки прав на внешнюю папку.

Про пустые состояния

Их три, и это не одно и то же:

  • «Записей пока нет» — файл создан, но пуст. Дальше появятся новые события.
  • «Нет читаемых записей» — в файле есть строки, но ни одна не похожа на запись журнала. Обычно значит, что в файл попал посторонний вывод.
  • «Ничего не найдено» — записи есть, но под текущие фильтры не подошла ни одна. В этом состоянии появляется кнопка сброса фильтров.

Последнее самое полезное: если вы сузили поиск и ничего не нашли, экран прямо предлагает вернуться к общему списку.

Про шапку

Слева в шапке видно источник и соотношение видано к общему, например 120/1830 records. Справа — состояние: reading во время чтения, live при работающем живом режиме, paused на паузе. Если в загруженном файле есть ошибки, к этому добавляется их число, и подпись в шапке становится красной.

Что агент умеет

Агент может открыть этот экран через мост командой открытия экрана logs и прочитать его содержимое командой чтения интерфейса, если приложение сейчас на экране.

Но главное здесь — то, чего экран не умеет вообще. У агента есть инструмент чтения логов, который берёт тот же файл и при этом листает его вглубь: за раз до 2000 строк, с прокруткой и курсором. То, что экрану доступны только последние 500 строк, агенту доступно целиком.

Агент также умеет искать по логу с фильтром, читать логи ворот, установки, замены серверной части, публикации и самой серверной части. Их на этом экране нет вообще: это файлы на стороне сервера, а экран показывает только телефон.

Есть ещё один лог, о котором стоит знать: у серверной части лежит своя копия потока приложения. Она не совпадает с тем, что видит экран — там строки идут с двойной меткой времени и без разбора на категории. Для разборов берите лог с экрана, а этот — чтобы понять, что происходило на стороне сервера.

Ограничения

  • Экран показывает только два файла: основной журнал и журнал VPN. Логов ворот, установки, замены и публикации здесь нет вообще.
  • Глубина чтения — последние 500 строк, пролистать глубже нельзя.
  • При превышении 512 килобайт файл очищается: старые записи исчезают без следа, архива нет.
  • Живой режим стоит каждые две секунды, но перечитывает файл только при изменении размера — без новых записей нагрузки почти нет.
  • Категория и уровень определяются по словам в тексте, а не системой. Смысл записи значения не имеет, важны только слова.
  • Поиск ищет и по разобранному сообщению, и по исходной строке, регистр игнорируется.
  • Только что очистившийся по лимиту файл покажет «записей пока нет». Это не начало работы, а середина — просто журнал в этот момент пуст.
  • Выгрузка копирует файл целиком и может не сработать, если нет прав на папку «Загрузки».
  • Фильтры и выбранный источник живут, пока жив экран: ушли на другой экран и вернулись — всё на месте. Полный перезапуск приложения сбрасывает их.
  • Все строки на экране английские.

Источник: docs/about/logs.md. Страница собрана из документации проекта при сборке сайта — без пересказа.