Логи читаются прямо из файлов приложения. Никакой серверной части посередине нет: приложение открывает свой файл и показывает хвост.
Возможности
- Переключатель источника двумя чипами: 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 килобайт файл очищается: старые записи исчезают без следа, архива нет.
- Живой режим стоит каждые две секунды, но перечитывает файл только при изменении размера — без новых записей нагрузки почти нет.
- Категория и уровень определяются по словам в тексте, а не системой. Смысл записи значения не имеет, важны только слова.
- Поиск ищет и по разобранному сообщению, и по исходной строке, регистр игнорируется.
- Только что очистившийся по лимиту файл покажет «записей пока нет». Это не начало работы, а середина — просто журнал в этот момент пуст.
- Выгрузка копирует файл целиком и может не сработать, если нет прав на папку «Загрузки».
- Фильтры и выбранный источник живут, пока жив экран: ушли на другой экран и вернулись — всё на месте. Полный перезапуск приложения сбрасывает их.
- Все строки на экране английские.