# Журнал сервера и диагностика авторизации — 0.7.4 После сборки/перезапуска строка `starting`/`ready` должна показывать 0.7.4. Это позволяет проверить, что запущен новый binary/container image. Без настройки журнал пишет info/warn/error в stderr (виден в Docker logs). Для диагностики одной попытки входа добавьте в Lua-конфиг: ```lua log = { debug = "*console" } log_format = "json" ``` В JSON-конфиге это поля `global.log = {"debug":"*console"}` и `global.log_format = "json"`. Обычный текст: `log_format = "plain"`. `debug = true` включает debug по умолчанию, если `log` не задан. Настройки наследуются из global, локальный `log` VirtualHost имеет приоритет. Файлы в стиле Prosody: ```lua log = { info = "/var/log/prosody/rust-xmpp.log"; error = "/var/log/prosody/rust-xmpp.err"; debug = "*console"; } log_format = "plain" ``` Каталоги должны существовать и быть доступны UID процесса. Файлы открываются append с правами 0600. Level-map включает указанный уровень и старшие уровни. Explicit sinks поддерживают диапазон и точный набор уровней: ```lua log = { { to = "file"; filename = "/var/log/prosody/debug.log"; levels = { min = "debug"; max = "warn" } }; { to = "console"; levels = { "error" } }; } ``` `levels = "warn"` в explicit sink — только warn, как у native loggingmanager. `log = "*console"` и `log = { "*console" }` включают debug и старше. Дополнительное сокращение runtime `log = "debug"` также пишет debug в консоль. Вся строка JSON/plain записывается под общим mutex, ID не смешиваются. Файлы ротируются внешним logrotate: после rename отправьте процессу SIGHUP. Журнал переоткроет destinations и запишет `logs-reopened`. При ошибке переоткрытия старые файловые дескрипторы сохраняются. SIGHUP здесь не означает горячую перезагрузку конфигурации или Lua-модулей. Автоматической ротации и retention нет. Native syslog sink, mixed Lua tables, timestamp templates и произвольные plugin sinks пока не реализованы. ## Как собрать одну попытку В JSON есть `timestamp`, `level`, `module`, `connection`, `event`, `fields`. `connection` — случайный ID одного transport, не SM resume token. Поля в `fields` — массив `{key,value}`, который можно преобразовать через jq `from_entries`. Проследите один ID от `connection-open` до `connection-closed`: 1. `connection-open`: host, transport, peer. 2. `tls-established`: фактическая версия TLS и cipher. 3. `sasl-features`: объявленные механизмы, CB-типы, account_hash и SSDP. 4. `sasl-attempt`: номер попытки, механизм, SASL1/SASL2. 5. `account-lookup`: нормализованный user, hash и состояние записи. 6. `sasl-challenge`, затем `auth-success` либо `sasl-rejected`. 7. `resource-bound`/`session-resumed`, затем `connection-closed`. При закрытии есть phase, reason, duration_ms и io_kind. Если клиент отключился после challenge, сервер видит только `phase=sasl-client-final` и disconnect; его внутреннюю причину (например, локальное отклонение SSDP) сервер узнать не может. Для этого потребуется клиентский журнал. Для HTTP adapter peer помечается not-forwarded: внутренний duplex не получает адрес HTTP-запроса. | Событие/причина | Что проверять | |---|---| | account-lookup: missing-or-disabled | Правильный host, data_path/volume, наличие и enabled-состояние аккаунта | | account-record-invalid | Lua account record повреждён или не поддержан | | account-hash-or-record-invalid | stored/server key length и настроенный SHA-1/SHA-256 должны соответствовать | | invalid-client-proof | Proof не проверилась: пароль, устаревшие credentials либо несовместимый расчёт клиента; это не доказательство конкретно неверного пароля | | channel-binding-mismatch | Выбранный CB не соответствует данному TLS-сеансу/сертификату | | channel-binding-downgrade-detected | Клиент отправил y при доступном серверном CB | | mechanism-not-offered | Клиент выбрал механизм, которого нет в sasl-features | | invalid-authzid | Authorization identity не совпадает с нормализованным владельцем | | client-aborted-after-challenge | Клиент явно отменил обмен; wire-ответ aborted | | inline-request-malformed | Ошибка Bind2/resume, поле detail уточняет класс | | bind-rejected/resource-conflict | Авторизация прошла, проблема уже на этапе ресурса | Дополнительно пишутся listener-ready, resource-replaced, session-disconnected (removed/hibernating и unacked count), session-expired, maintenance-failed, базовые открытия/закрытия входящих S2S и shutdown-requested. Это начальное покрытие операций, не полная замена всех журналов модулей Prosody. В журнал не передаются пароли, соль/ключи, SASL base64, nonce/proof, resume/push токены и XML/тела сообщений. Имена аккаунтов и peer-адреса присутствуют для диагностики, как в Prosody. Дополнительный фильтр редактирует sensitive field keys; escaping исключает вставку новых строк/control characters в запись. Нужен фрагмент одной неуспешной попытки Conversations/monocles, включая version и перечисленные события. До получения этого фрагмента причина конкретного оставшегося отказа на вашей установке не установлена. ## Изменения 0.7.1 Одинаковые console destinations (включая aliases) и одинаковые строки путей файлов объединяются с union уровней; overlapping rules не создают дубликаты. Разные destinations получают независимые копии записи согласно своим уровням. `sasl-attempt` теперь записывается до inline validation. `sasl-inline-options` содержит только requested/available flags без payload. Необъявленный cached Bind2/SM логируется как `inline-request-ignored` с причиной bind2-disabled или sm-disabled и fallback=post-auth-stream-features. Это не ошибка пароля. Malformed enabled inline extensions сохраняют rejection и более точный detail. ## PEP/PubSub в 0.7.2 INFO pubsub-iq-result содержит классифицированные action/node_kind/status/condition, precondition_not_met и счётчик deliveries. Для disco — pep_identity, persistent_items, publish_options. Идентификаторы устройства/элемента/запроса, полные имена узлов и payload не печатаются. WARN iq-dispatch-failed содержит безопасный io_kind. Значение deliveries не доказывает получение клиентом. Интерпретация ошибок и проверка после обновления — PEP-DIAGNOSTICS.md. ## Содержимое результата PEP в 0.7.3 `target_scope` классифицирует цель запроса без её адреса. У successful items result `items_count` — число непосредственных item, `first_content_kind` — известный класс первого payload или none/other/nested-item, `first_device_count` — количество непосредственных device в распознанном списке первого item. Никаких значений device ID или bundle bytes. Это структура XML, не проверка валидности ключей, доверия или числовых ID. Для других операций этих счётчиков нет. `implicit` означает отсутствие to; сам по себе он не утверждает выбор аккаунта. ## HTTP и PEP0.7.4 HTTP diagnostics: listener-ready, connection-open, tls-established, request-complete route/status, connection-closed phase/reason. Routes ограничены websocket/bosh/other; raw URLs, queries, Origin/headers/bodies не пишутся. Для подключения Converse: CONVERSE-WSS.md. PEP IQ: device_protocol legacy/omemo2/other, valid_device_count и invalid_device_count. notification-generated: content_present и такие же счётчики локально созданного сообщения ДО routing, не подтверждение доставки. ID/JID/ключевые данные не добавляются. Подробности — PEP-DIAGNOSTICS.md.