Формат логов
Точная форма строки лога: что означает каждый сегмент, метки уровней фиксированной ширины, альтернатива в виде JSON и набор маскируемых по умолчанию ключей.
Строчный формат (SpringLineFormatter)
Форматтер по умолчанию для format: 'line'. Одна запись на строку:
[datetime] [LEVEL] -channel- [pid] (ClassName): message {json}
[datetime] [LEVEL] -channel- [pid]: message {json}| Сегмент | Источник | Заметки |
|---|---|---|
[datetime] |
дата-время записи | Y-m-d H:i:s. |
[LEVEL] |
уровень записи | Метка фиксированной ширины в 5 символов — см. ниже. |
-channel- |
канал Monolog | Зарегистрированное имя канала (http, cli, sys, …). |
[pid] |
getmypid() |
Идентификатор процесса-отправителя в ОС — всегда присутствует. Различает форкнутых потомков в демонах/воркерах. |
(ClassName) |
context['class'] |
Короткое имя класса. Присутствует только когда логгер получен через getLogger(Class::class); отсутствует у сырого channel(). |
message |
сообщение лога | Как передано. |
{json} |
context + extra |
Объединены и закодированы в JSON. Опускается, когда пусто. |
JSON-хвост объединяет context вызова с влитым extra (контекст запроса), кодируя с
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES. При конфликте ключей побеждает extra.
Примеры
[2024-01-01 12:00:00] [INFO ] -http- [4821]: request handled {"request_id":"abc-123"}
[2024-01-01 12:00:00] [DEBUG] -http- [4821] (PpaConnectionPool): FPM connection opened {"class":"App\\Pool\\PpaConnectionPool"}
[2024-01-01 12:00:00] [ERROR] -http- [4821] (UserService): db timeout {"class":"App\\UserService","attempt":3}
[2024-01-01 12:00:00] [WARN ] -sys- [4821]: disk usage highМетки уровней
Каждый уровень отображается в метку фиксированной ширины в 5 символов (с добивкой, чтобы колонки выравнивались):
| Уровень | Метка |
|---|---|
| Debug | DEBUG |
| Info | INFO |
| Notice | NOTIC |
| Warning | WARN |
| Error | ERROR |
| Critical | CRIT |
| Alert | ALERT |
| Emergency | EMERG |
Завершающий перевод строки
Форматтер добавляет \n по умолчанию. Для output: 'syslog' менеджер строит его с
appendNewline = false, потому что syslog сам обрамляет каждое сообщение. Делается
автоматически.
Формат JSON (JsonFormatter)
Для format: 'json' — JsonFormatter из Monolog в режиме построчной пачки, один JSON-объект
на строку. Подходит для агрегаторов логов (Loki, Elasticsearch, Datadog). Пустые context и
extra не опускаются, а трассировки стека включаются.
{"message":"user created","context":{"id":42,"class":"App\\Service\\UserService"},"level":200,"level_name":"INFO","channel":"http","datetime":"2024-01-01T12:00:00+00:00","extra":{"request_id":"abc-123"}}Маскируемые ключи
Ключи, маскируемые по умолчанию
SensitiveMaskingProcessor
(регистронезависимо, рекурсивно). Каждое совпавшее значение становится ***:
password passwd secret
token access_token refresh_token
api_key apikey authorization
auth cookie set-cookie
credit_card card_number cvv
ssn pinДобавьте свои через конструктор — см. Маскирование данных.
Связанное
- Конфиг канала — выбор
formatиoutput - Жизненный цикл записи лога — как запись достигает форматтера
- Справочник API → Обработчик и форматтер