feat: add message replacement for log records
Add Logger.AddReplacer to mask or normalize message text before records reach writers. Document replacement behavior in README and package GoDoc, and update the example. Also fix JSON writer edge cases: - avoid panic on empty message lists - preserve newline semantics when the last message already ends with n - keep original message argument types for custom writers when no replacers are configured Update dependencies and add release notes for the next release.
This commit is contained in:
+22
-1
@@ -11,6 +11,7 @@ English version: [README.md](README.md)
|
||||
- `stdout`, файлы и любые внешние `io.Writer`.
|
||||
- Опциональные timestamp'ы для текстового вывода.
|
||||
- Компактный traceback для текстовых writer'ов и полный traceback для JSON.
|
||||
- Замена текста в сообщениях для маскирования секретов или нормализации вывода.
|
||||
- Явные правила владения writer'ами при `Close()`.
|
||||
|
||||
## Установка
|
||||
@@ -35,7 +36,8 @@ func main() {
|
||||
Prefix("API").
|
||||
Level(slog.DEBUG).
|
||||
PrintTraceback(true).
|
||||
JsonPretty(true)
|
||||
JsonPretty(true).
|
||||
AddReplacer("SOME_SECRET", "<redacted>")
|
||||
|
||||
text := logger.CreateTextStdoutWriter()
|
||||
jsonFile, err := logger.CreateJsonFileWriter("logs/app.json")
|
||||
@@ -49,6 +51,7 @@ func main() {
|
||||
logger.Warnln("cache miss")
|
||||
logger.Errorln("request failed")
|
||||
logger.Debugln("debug details")
|
||||
logger.Infoln("token", "SOME_SECRET")
|
||||
|
||||
if err := logger.Close(); err != nil {
|
||||
log.Fatal(err)
|
||||
@@ -116,12 +119,30 @@ JSON writer записывает объект со следующими поля
|
||||
|
||||
Если включен `JsonPretty(true)`, JSON выводится с отступами.
|
||||
|
||||
## Замена сообщений
|
||||
|
||||
`AddReplacer(old, new)` заменяет найденный текст в каждом сообщении до того,
|
||||
как запись попадет в writer'ы. Правила замены применяются в порядке добавления.
|
||||
|
||||
```go
|
||||
logger := slog.CreateLogger().
|
||||
Level(slog.DEBUG).
|
||||
AddReplacer("SOME_SECRET", "<redacted>").
|
||||
AddReplacer("user@example.com", "<email>")
|
||||
|
||||
logger.Infoln("login token:", "SOME_SECRET")
|
||||
```
|
||||
|
||||
В текстовом и JSON-выводе вместо `SOME_SECRET` будет записано `<redacted>`.
|
||||
Пустое значение `old` игнорируется.
|
||||
|
||||
## API кратко
|
||||
|
||||
- `Info`, `Warn`, `Error`, `Debug`, `Fatal` принимают список значений.
|
||||
- `Infof`, `Warnf`, `Errorf`, `Debugf`, `Fatalf` используют `fmt.Sprintf`.
|
||||
- Методы `*ln` добавляют семантику перевода строки, что удобно для `stdout`, Docker и line-based collectors.
|
||||
- `Fatal`, `Fatalf` и `Fatalln` вызывают `os.Exit(1)` после записи сообщения.
|
||||
- `AddReplacer` маскирует или переписывает текст сообщений перед отправкой в writer'ы.
|
||||
|
||||
## Поведение traceback
|
||||
|
||||
|
||||
Reference in New Issue
Block a user