FILE / ScuroNeko/SNekLog

README_ru.md

Исходный файл и его история в репозитории.
FILE v2.0.0
Files
SNekLog/README_ru.md
T
ScuroNeko d534f92d48 (refactor): prepare breaking v2 API
- rename package to sneklog and move module to /v2
- replace text output flags with writer formatters
- remove external color dependencies
- update migration notes and coverage
2026-04-24 15:43:14 +03:00

5.3 KiB
Raw Permalink Blame History

SNekLog (ScuroNeko Logger)

Небольшой структурированный логгер для Go с текстовым и JSON-выводом, несколькими writer'ами и настраиваемыми traceback-метаданными.

English version: README.md

Возможности

  • Одновременная запись в несколько destinations.
  • Текстовый и JSON-форматы.
  • stdout, файлы и любые внешние io.Writer.
  • Опциональные timestamp'ы для текстового вывода.
  • Компактный traceback для текстовых writer'ов и полный traceback для JSON.
  • Замена текста в сообщениях для маскирования секретов или нормализации вывода.
  • Явные правила владения writer'ами при Close().

Установка

go get git.scuroneko.dev/scuroneko/slog/v2

Быстрый старт

package main

import (
	"log"

	"git.scuroneko.dev/scuroneko/slog/v2"
)

func main() {
	logger := sneklog.CreateLogger().
		Prefix("API").
		Level(sneklog.DEBUG).
		AddReplacer("SOME_SECRET", "<redacted>")

	text := logger.CreateTextStdoutWriter()
	jsonFile, err := logger.CreateJsonFileWriter("logs/app.json")
	if err != nil {
		log.Fatal(err)
	}

	logger.AddWriters(text, jsonFile)

	logger.Infoln("service started")
	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)
	}
}

Значения по умолчанию

CreateLogger() создает логгер со следующими настройками:

  • Prefix("LOG")
  • Level(sneklog.FATAL)
  • JsonPretty(false)
  • текстовый formatter: sneklog.DefaultTextFormatter
  • JSON formatter: sneklog.DefaultJsonFormatter

Важно: в текущей модели уровней Level(sneklog.FATAL) пропускает INFO, WARN, ERROR и FATAL, но не DEBUG. Чтобы включить все сообщения, используйте Level(sneklog.DEBUG).

Writer'ы и владение

Logger.Close() закрывает только writer'ы, которые логгер создал сам:

  • CreateTextFileWriter(...)
  • CreateJsonFileWriter(...)

Внешние writer'ы не закрываются:

  • CreateTextWriter(existingWriter)
  • CreateJsonWriter(existingWriter)
  • CreateTextStdoutWriter()
  • CreateJsonStdoutWriter()

Это позволяет безопасно подключать bytes.Buffer, сетевые writer'ы и другие уже управляемые ресурсы.

Форматы вывода

Текстовый writer формирует записи вида:

2026-03-17T14:05:09+03:00 info API: service started

Используйте SetFormatter у writer'а, чтобы настроить timestamp'ы, traceback-поля, цвета и шаблон сообщения.

JSON writer записывает объект со следующими полями:

{
  "time": "2026-03-17T14:05:09.123456789+03:00",
  "level": "info",
  "prefix": "API",
  "message": "service started",
  "traceback": [
    {
      "method": "main",
      "filename": "main.go",
      "line": 27,
      "signature": "main.main",
      "fullPath": "/path/to/main.go"
    }
  ]
}

Если включен JsonPretty(true), JSON выводится с отступами.

Замена сообщений

AddReplacer(old, new) заменяет найденный текст в каждом сообщении до того, как запись попадет в writer'ы. Правила замены применяются в порядке добавления.

logger := sneklog.CreateLogger().
	Level(sneklog.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

  • Текстовые writer'ы используют ближайший пользовательский stack frame.
  • JSON writer'ы получают полный traceback.
  • Внутренние frame'ы slog и runtime фильтруются из traceback.

Пример из репозитория

См. examples/main.go.

Лицензия

Проект распространяется под GNU GPLv3. См. LICENSE.