# Поиск по логам в WireCat Desktop (/ru/docs/desktop/logs)

Страница **Logs** в WireCat Desktop показывает, что каждый инструмент командной строки записал о своих запусках. **Запуск** — это один старт инструмента, например `tg personal messages send`, от начала до выхода. Откройте эту страницу, когда инструмент упал и нужно понять почему, как часто это бывает или какие команда, профиль или ошибка тут замешаны. Вы научитесь фильтровать запуски, группировать их, открывать один запуск и копировать его запись для отчёта об ошибке.

## Что показывает страница [#что-показывает-страница]

Логи запусков ведут Telegram (`tg`), MAX (`max`) и WhatsApp (`wa`). Приложение читает их собственными командами инструмента `runs list` и `runs show`. Zoom (`zm`), Google Drive (`drive`) и Memo (`memo`) пока не ведут логов, которые приложение может прочитать. Строка над поиском показывает каждый инструмент и сколько запусков приложение у него прочитало. Приложение читает 500 последних запусков каждого инструмента; **Load older** читает следующие 500.

## Почему почти все запуски — ошибки [#почему-почти-все-запуски--ошибки]

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

Чтобы сохранять каждый запуск, нажмите **Keep every run** у нужного инструмента вверху страницы Logs или задайте настройку сами:

```sh
tg config set record true --defaults
```

Настройка действует для всех профилей этого инструмента. Для MAX или WhatsApp напишите `max` или `wa` вместо `tg`. Инструмент удаляет запуски старше `keep_runs_for_days` дней. По умолчанию — 30 дней. Где хранятся эти настройки и как их менять, объясняет страница [Настройки](/llms.mdx/docs/ru/configuration/content.md).

## Поиск запусков [#поиск-запусков]

Пишите в поле поиска над списком. Поиск состоит из условий, разделённых пробелами. Запуск должен подходить под каждое условие.

| Как писать | Что значит | Пример |
| --- | --- | --- |
| `field:value` | У поля такое значение. Значение должно совпасть целиком, регистр букв не важен. | `status:failed` |
| `field:"two words"` | Значение с пробелами берите в кавычки. | `cli_command:"tg messages send"` |
| `*` | Любые символы, в том числе ни одного. Так можно найти часть значения. | `cli_command:"tg messages*"` |
| `-` перед условием | Исключить запуски, которые подходят под условие. | `-profile:work` |
| `field:>N`, `<`, `>=`, `<=` | Сравнить число. | `duration_ms:>1000` |
| `a.b.c:value` | Поле внутри другого поля. Список подходит, если подходит один из его элементов. | `partial.failures.stage:upload` |
| слово без `field:` | Текст, который входит в основные поля запуска: команду, профиль, статус или коды ошибок. | `timeout` |

Два значения одного поля подходят **любым** из них: `tool:tg tool:max` покажет запуски обоих инструментов. Разные поля должны подойти **все**: `tool:tg status:failed` покажет только упавшие запуски `tg`. Исключение и сравнение чисел всегда действуют сами по себе. Например, `duration_ms:>1000 duration_ms:<5000` найдёт запуски длиной от одной до пяти секунд.

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

### Поля [#поля]

| Поле | Что в нём | Пример значения |
| --- | --- | --- |
| `tool` | Инструмент, который записал запуск | `tg` |
| `status` | Чем закончился запуск | `failed`, `partial`, `success`, `running` |
| `cli_command` | Имя инструмента и его команда | `tg messages send`[↗](/llms.mdx/docs/ru/tg/commands-personal/content.md#tg-messages-send "Справочник команды: tg messages send") |
| `command` | Команда без имени инструмента | `messages send` |
| `profile` | Профиль, с которым шёл запуск | `work` |
| `error_code` | Почему запуск упал | `rate_limited` |
| `codes` (или `code`) | Коды ошибок запросов в этом запуске | `timeout` |
| `operations` (или `operation`) | Запросы, которые инструмент сделал к сервису | `messages.getHistory` |
| `duration_ms` (или `duration`) | Сколько длился запуск, в миллисекундах | `31000` |
| `requests` | Сколько запросов сделал инструмент | `3` |
| `cli_version` | Версия инструмента | номер версии |
| `run_id` | Идентификатор запуска | `20261025T100000Z-sync-a1b2c3` |

У запуска бывают и другие поля. Откройте запуск, чтобы увидеть все: любое поле его записи можно искать по имени или по пути. Если `cli_command` — только имя инструмента, например `max`, инструмент запустили без команды, которую он знает. Обычно это опечатка или не указан профиль.

### Примеры поиска [#примеры-поиска]

| Что найти | Поиск |
| --- | --- |
| Упавшие запуски одной команды | `status:failed cli_command:"tg messages send"` |
| Ограничения частоты запросов за последние сутки | `code:rate_limited`, затем выберите **Last 24h** |
| Медленные запуски | `duration_ms:>10000` |
| Запуски одного профиля | `profile:work` |
| Ошибки, кроме тайм-аутов | `status:failed -error_code:timeout` |
| Частичные запуски, где не удалась загрузка | `status:partial partial.failures.stage:upload` |

### Чем это отличается от поиска сообщений [#чем-это-отличается-от-поиска-сообщений]

[Поиск сообщений](/llms.mdx/docs/ru/search-playground/content.md) использует синтаксис Lucene. Поиск по логам проще:

* Нет слов `AND`, `OR`, `NOT` и скобок. Пробел значит «и», одно поле дважды — «любое из», `-` исключает.
* `field:value` должно совпасть со всем значением. Чтобы найти часть, добавьте `*`. Слова без поля находят часть значения.
* `*` — единственный шаблон. Нет `?`, нечёткого поиска и диапазонов в скобках.
* Нет поля даты для сравнения. Используйте кнопки периода.

## Фильтры по фасетам [#фильтры-по-фасетам]

Колонка слева показывает **фасеты**: значения полей Tool, Status, Command, Profile и Error code и число запусков для каждого. Нажмите значение, чтобы оставить только эти запуски, и нажмите ещё раз, чтобы снять фильтр. Alt + клик по значению или его кнопка с минусом скрывают эти запуски. Каждый клик добавляет условие в поле поиска, поэтому поиск можно увидеть и поправить. Числа учитывают все остальные условия поиска. Поэтому можно выбрать и второе значение того же фасета.

В узком окне фасеты открывает кнопка **Facets**.

## Группировка запусков [#группировка-запусков]

Выберите поле в **Group by**, чтобы увидеть по строке на каждое значение: сколько у него запусков, сколько из них упало и когда начался последний. Группировать можно и из фасета кнопкой **Group by this field**, и из значения в записи запуска кнопкой **Group by**. Нажмите строку группы, чтобы оставить только её запуски.

## Период [#период]

Выберите **Last 1h**, **Last 24h**, **Last 7d**, **Last 30d** или **All**. Период действует на запуски, которые приложение загрузило. Если старого запуска не видно, нажмите **Load older** у этого инструмента.

## Открыть запуск [#открыть-запуск]

Нажмите запуск, чтобы открыть его. Вы увидите:

* **Events** — события: запросы, которые инструмент сделал к сервису, и важные шаги запуска, со временем, результатом и длительностью каждого. Нажмите событие, чтобы увидеть все его поля.
* **Run record** — запись запуска: всё, что инструмент сохранил о нём, в виде раскрывающегося дерева. У большинства значений есть кнопки: фильтровать по нему, исключить его, сгруппировать по его полю и скопировать.
* **Copy JSON** копирует всю запись запуска. Приложите её к отчёту об ошибке или отдайте агенту.

**Copy run id** копирует идентификатор запуска. Его можно передать команде инструмента `runs show`.

## Приватность [#приватность]

В записях запусков никогда нет текста сообщений, имён людей, названий чатов и секретов входа, например паролей и ключей сессии. Что инструмент записывает, а что никогда, перечисляет [руководство по диагностике Telegram](/llms.mdx/docs/ru/tg/diagnostics/content.md).

Перед показом запуска приложение ещё и скрывает личные данные: значения полей вроде токенов, паролей, телефонов, адресов почты, имён аккаунтов и ID пользователей становятся `•••`. В тексте приложение заменяет адреса почты на `[email]`, номера телефонов — на `[number]`, токены ботов — на `[bot token]`. То же скрытие действует и для того, что вы копируете.

Отчёт об ошибке, отправленный из приложения, всегда содержит последние логи ошибок: 20 последних упавших запусков каждого установленного инструмента, скрытые тем же способом. Сервер WireCat скрывает их ещё раз. Они хранятся закрыто на сервере WireCat 90 дней, затем удаляются, и никогда не публикуются. В остальных случаях логи не покидают ваш компьютер. Что отправляет отчёт об ошибке, объясняет [политика конфиденциальности](/ru/privacy#bug-reports).
