Thanks to visit codestin.com
Credit goes to github.com

Skip to content

azorg/xlog

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

88 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

xlog

import "github.com/azorg/xlog/v2"

X Logger

xlog - ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ срСдства настройки *slog.Logger ΠΈΠ· стандартного ΠΏΠ°ΠΊΠ΅Ρ‚Π° "log/slog".

ΠŸΠ°ΠΊΠ΅Ρ‚ прСдоставляСт возмоТности настройки Π»ΠΎΠ³Π³Π΅Ρ€Π° Π½Π° основС структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ управлСния ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ВстроСна ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ². Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² ΠΊΠ°Π½Π°Π» (stdout/stderr), Π² Ρ„Π°ΠΉΠ» ΠΈ Π² кастомный io.Writer ΠΏΡ€ΠΈ нСобходимости. Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ логирования ΠΈ для Π½ΠΈΡ… установлСны ΠΌΠ΅Ρ‚ΠΊΠΈ (trace/notice/crit ΠΈ Ρ‚.ΠΏ.). Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ…Π΅Π½Π΄Π»Π΅Ρ€ΠΎΠ² (Text/JSON). Π•ΡΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ управлСния Π²ΠΈΠ΄ΠΎΠΌ ΠΆΡƒΡ€Π½Π°Π»Π° (Π² Ρ‚.Ρ‡. Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ) ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ встраивания Ρ‚.Π½. middleware для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… "Ρ…ΡƒΠΊΠΎΠ²", "Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²".

Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ дополнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ содСрТащСм ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΠ΅ врСмя ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ "log/slog" Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ поставку Go начиная с вСрсии go1.21. Для использования с go1.20 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ "golang.org/x/exp/slog".

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ "gopkg.in/natefinch/lumberjack.v2".

Π—Π°Π»ΠΎΠΆΠ΅Π½Ρ‹ "мостики" Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ³ΠΎ повСдСния стандартного (legacy) Π»ΠΎΠ³Π³Π΅Ρ€Π° ΠΈΠ· стандартного ΠΏΠ°ΠΊΠ΅Ρ‚Π° "log" ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ‡Π΅Ρ€Π΅Π· настроСнный Π»ΠΎΠ³Π³Π΅Ρ€ slog.

Π’ рядС случаСв ΠΈΠ· всСго ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° функция Setup(), которая Π½Π° основС структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ глобального стандартного Go Π»ΠΎΠ³Π³Π΅Ρ€Π° "log" ΠΈ структурного Π»ΠΎΠ³Π³Π΅Ρ€Π° "slog".

Для настройки Π»ΠΎΠ³Π³Π΅Ρ€Π° Π»ΠΎΠ³Π³Π΅Ρ€Π° Π² ΠΏΠ΅Ρ€ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ New(), которая Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру *Logger, которая Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ *slog.Logger, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ slog.LevelVar ΠΈ интСрфСйс Writer. ПослСдниС Π΄Π²Π° поля ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для измСнСния уровня логирования Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³ΠΎΠ² соотвСтствСнно.

Для создания Π»ΠΎΠ³Π³Π΅Ρ€ΠΎΠ² с Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ io.Writer ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° NewWithWriter() ΠΈΠ»ΠΈ NewEx().

Об Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ slog ΠΈ xlog

ΠŸΠ°ΠΊΠ΅Ρ‚ slog ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ "Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄" Π² Π²ΠΈΠ΄Π΅ структуры slog.Logger ΠΈ Π΅Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для формирования записСй ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈ "бэкСнд" Π² Π²ΠΈΠ΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ интСрфСйса slog.Handler, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ записСй Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ io.Writer интСрфСйс. "Из ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ" slog ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ нСсколько Handler'ΠΎΠ² (Ρ…Π΅Π½Π΄Π»Π΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, slog.TextHandler ΠΈ slog.JSONHandler).

ΠŸΠ°ΠΊΠ΅Ρ‚ xlog Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ "Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°" Π² Π²ΠΈΠ΄Π΅ структуры xlog.Logger ΠΈ Π΅Ρ‘ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ "сахарныС" ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ Trace ΠΈΠ»ΠΈ Debugf. Π’ Ρ‚ΠΎΠΆΠ΅ врСмя ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ "каноничСский Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄" slog ΠΈ использованиС "сахарных" ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠŸΠ°ΠΊΠ΅Ρ‚ xlog обСспСчиваСт Π³ΠΈΠ±ΠΊΡƒΡŽ настройку hanlder'ΠΎΠ² c Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°ΠΌΠΈ ΠΈ Middleware. ΠšΡ€ΠΎΠΌΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² стандартного, Text ΠΈ JSON hendler'Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС "чСловСчСского" Ρ…Π΅Π½Π΄Π»Π΅Ρ€Π° с простым тСкстовым Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ (TintHandler) Π² Ρ‚.Ρ‡. с ANSI подкраской Π²Ρ‹Π²ΠΎΠ΄Π°.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ API xlog позволяСт Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» сразу ΠΏΠΎ нСскольким направлСниям (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠ°Π½Π°Π» stderr ΠΈ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ). Для подробностСй см. интСрфСйс Writer ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Π³ΠΎ формирования. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌΡƒ числу Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ (см. MiltiWtiter).

Как ΠΏΡ€ΠΈ создании Handler'ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ создании Logger'Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Middleware, которая позволяСт ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Handle ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Handler'Π°.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ использования Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… log/slog Π»ΠΎΠ³Π³Π΅Ρ€ΠΎΠ²

// Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
conf := xlog.Conf{
  Level: "info",
}

// ΠžΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния
xlog.Env(&conf)

// ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ всС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½ΠΎ
xlog.Setup(conf)

// ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°
xlog.SetLevel(slog.LevelDebug)

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹ log/slog
slog.Debug("debug message", "value", 42)
slog.Info("simple slog", "logLevel", GetLvl())
slog.Error("error", "err", errors.New("some error"))
log.Print("legacy logger")

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ использования xlog с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΈ ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

opt := xlog.NewOpt()  // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ (*xlog.Opt)
conf := xlog.Conf{}   // ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ xlog
flag.Parse()          // ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ opt ΠΈΠ· ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки
opt.UpdateConf(&conf) // ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ conf опциями ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

log := xlog.New(conf) // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ X-logger (*xlog.Logger)
logger := log.Logger  // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° *slog.Logger

log.Notice("ΠŸΡ€ΠΈΠ²Π΅Ρ‚, XLog", "version", "1.0.0")
mylog := logger.With("app", "helloworld")
mylog.Info("application started")

userLoginInfo := xlog.Fields{
  "user_id":   123,
  "ip":        "192.168.0.1",
  "timestamp": time.Now(),
}

mylog.Debug("user login", "userLoginInfo", userLoginInfo)

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ xlog.Logger Π² slog.Logger ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ

X-logger (`*xlog.Logger`) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² `*slog.Logger` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Slog() ΠΈΠ»ΠΈ просто доступа ΠΊ полю Logger.

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ NewFromSlog(). ΠŸΡ€ΠΈ этом для Π»ΠΎΠ³Π³Π΅Ρ€Π° Π±ΡƒΠ΄ΡƒΡ‚ доступны "сахарныС" ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚ΠΈΠΏΠ° Debugf(), Notice(), Log(), Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования "Π½Π° Π»Π΅Ρ‚Ρƒ" с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Leveler'Π° ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΡƒΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ.

ΠŸΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ NewWithWriter() ΠΈ NewEx() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹, Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ интСрфСйс io.Writer, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ сокСты ΠΈ FIFO, syslog.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Writer

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ NewWriter ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан интСрфСйс Writer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ NewEx(). Π’ зависимости ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ 12 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса Writer. Π’Ρ‹Π²ΠΎΠ΄ ΠΆΡƒΡ€Π½Π°Π»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΠΎ нСскольким направлСниям:

  1. Канал/pipe (stdout/stderr)
  2. Π€Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ Π±Π΅Π·
  3. ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ io.Writer Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Middleware

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ Middleware ΠΈ Ρ‚ΠΈΠΏ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² MiddlewareFunc для ΠΈΡ… построСния. Middleware позволяСт "ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ" (Π² Ρ‚.Ρ‡. Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ) ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Handle() интСрфСйса slog.Handler. Middleware позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ "Ρ…ΡƒΠΊΠΈ/ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ" для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ управлСния ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π’ частности middleware ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ записи ΠΆΡƒΡ€Π°Π»ΠΎΠ² с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ свойствами Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ особым ΠΏΡƒΡ‚Π΅ΠΌ. Π‘ использованиСм Middleware Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΠ±ΠΎΠ³Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ (goroutine, logId, logSum). Π”Π°Π½Π½Ρ‹ΠΉ middleware добавляСтся Π² ΠΊΠΎΠ½Π΅Ρ† Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ.

Π Π΅ΠΆΠΈΠΌ "Multi handler"

Π‘ использованиСм Middleware ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠ³Π³Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΡ‚Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» Π² Ρ„Π°ΠΉΠ» Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON ΠΈ Π½Π° стандартный Π²Ρ‹Π²ΠΎΠ΄ Π² тСкстовом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π½Π΅ΠΌΠ΅Π½Π½ΠΎ. Для достиТСния Π΄Π°Π½Π½ΠΎΠΉ возмоТности ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ middleware, создаваСмая с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ NewMiddlewareMulti().

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для ΠΆΡƒΡ€Π½Π°Π»Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π° stdout ΠΈ Π² Ρ„Π°ΠΉΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

// Настройки ΠΆΡƒΡ€Π½Π°Π»Π° для Π²Ρ‹Π²ΠΎΠ΄Π° Π² JSON Ρ„Π°ΠΉΠ» с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ
conf := xlog.Conf{
  Level:     "debug",
  File:      "logs/itcagent.log",
  FileMode:  "0640",
  Format:    "json", // JSON handler
  GoId:      true,
  IdOn:      true,
  SumOn:     true,
  SumFull:   true,
  SumAlone:  false,
  TimeLocal: false, // UTC
  Src:       true,
  SrcPkg:    true,
  SrcFunc:   true,
  SrcFields: &xlog.Fields{
    "id":   "xservice", // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСрвиса
    "host": "xservice.example.com",
  },
  RateLimit: RateLimitConf{
    Disable:       false, // Π½Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Rate Limiter
    MaxNum:        100,   // максимальноС число ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… сообщСний [ΡˆΡ‚]
    IntervalMs:    1000,  // Π·Π° Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ [мс]
		FlushPeriodMs: 3000,  // ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ сброса Π·Π°Π΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹Ρ… сообщСний [мс]
   },
  Rotate: xlog.RotateConf{
    Enable:     true,
    MaxSize:    5,     // MB
    MaxAge:     7,     // days
    MaxBackups: 100,   // number
    LocalTime:  false, // UTC
    Compress:   true,
  },
}

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠ³Π³Π΅Ρ€ (Ρ…Π΅Π½Π΄Π»Π΅Ρ€) для Π²Ρ‹Π²ΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ»
log := xlog.New(conf)

// Настройки "чСловСчСского" ΠΆΡƒΡ€Π½Π°Π»Π° для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° stdout
conf = xlog.Conf{
  Level:      "trace",
  Pipe:       "stdout",
  Format:     "tint", // tinted handler
  GoId:       false,
  IdOn:       true,
  SumOn:      true,
  TimeLocal:  true,    // Local time
  TimeFormat: "space", // 2006-01-02_15.04.05.999999999
  Src:        true,
  SrcPkg:     false,
  SrcFunc:    false,
  Color:      true,
}

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ "Multi Handler" Π»ΠΎΠ³Π³Π΅Ρ€ (stdout/text + file/JSON)
log = xlog.New(conf, xlog.NewMiddlewareMulti(log))

log.Debug("Hello, Multi Handler!", "cnt", 1) // ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π² JSON Ρ„Π°ΠΉΠ» ΠΈ Π½Π° stdout
log.Trace("Hello, Multi Handler!", "cnt", 2) // ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° stdout
log.Flood("Hello, Multi Handler!", "cnt", 3) // Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ

Fields, FieldsProvider

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ простой Π±ΠΈΠ½Π΄ΠΈΠ½Π³ для наполнСния записСй ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ· ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ космСтичСская Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° go fmt Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ для ΠΊΠ°Ρ€Ρ‚, Ρ‡Ρ‚ΠΎ Π±Π»Π°Π³ΠΎΡ‚Π²ΠΎΡ€Π½ΠΎ влияСт Π½Π° Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Ρ„Π½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π»ΠΎΠ³Π³Π΅Ρ€Π° WithFields, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ With ΠΈ WithAttrs, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½Π° Π²Ρ…ΠΎΠ΄ интСрфСйсы FieldsProvider.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использованиС Fields:

xlog.Error(
  "error with fields (Args)",
  "err", errors.New("error"),
  slog.Group(
    "header",
    xlog.Fields{
      "type": "magic",
      "size": 16384,
    }.Args()...))

log := xlog.WithAttrs(xlog.Fields{
  "application": "testAplication",
  "version":     "1.2.3",
}.Attrs())

log.Notice("notice with fields (Args)", "someFlag", true)

log.Debug(
  "debug with fields",
  xlog.Fields{
   "superValue": 123,
   "now":        time.Now(),
   "str":        "some string",
   "pi":         3.1415926,
  }.Args()...)

logXY := log.WithFields(xlog.Fields{
	"x": 1,
	"y": 2,
})

logXY.Debug("vector", "z", 3)

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° xlogscan

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ цСлостности Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² JSON Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свСрки ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сумм (logSum ΠΈΠ»ΠΈ LogId).

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° основана Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ChecksumVerify(), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ структуру Ρ‚ΠΈΠΏΠ° ChecksumRes ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи. КаТдая запись Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° JSON Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ChecksumVerify.

Π‘ Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ?

  1. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ со структурой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf
  2. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ со структурой Logger
  3. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с интСрфСйсом Writer
  4. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с конструкторами для структуры Logger
  5. ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ структуры Logger
  6. ΠžΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с устройством Middleware
  7. ΠžΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с устройством Rate Limiter'Π°

Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ глобального Π»ΠΎΠ³Π³Π΅Ρ€Π° эквивалСнтныС ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ структуры Logger (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Infof() ΠΈΠ»ΠΈ Fatal())

Index

Constants

const (
    // ΠœΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² JSON/text ΠΆΡƒΡ€Π½Π°Π»Π΅
    TimeKey = "time"

    // ΠœΠ΅Ρ‚ΠΊΠ° уровня Π² JSON/text ΠΆΡƒΡ€Π½Π°Π»Π΅
    LevelKey = "level"

    // ΠœΠ΅Ρ‚ΠΊΠ° сообщСния JSON/logfmt ΠΆΡƒΡ€Π½Π°Π»Π΅
    MsgKey = "msg"

    // ΠœΠ΅Ρ‚ΠΊΠ° исходных тСкстов Π² JSON ΠΆΡƒΡ€Π½Π°Π»Π΅
    SourceKey = "source"
)

const (
    // ΠŸΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΆΡƒΡ€Π½Π°Π»Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    // (ΠΏΡ€ΠΈ пустой строкС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ)
    FileModeDefault = 0640

    // ΠŸΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΆΡƒΡ€Π½Π°Π»Π° Π² случаС ошибки Π² строкС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
    FileModeOnError = 0600 // Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅/запись Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ

    // ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°Ρ… Π΄ΠΎ Π΅Π³ΠΎ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ
    // ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли MaxSize=0
    RotateMaxSize = 10 // 10 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚

    // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JSON Ρ‚Π΅Π³ΠΈ структур для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡ… Π²Ρ‹Π²ΠΎΠ΄Π°
    // Π² ΠΆΡƒΡ€Π½Π°Π» (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для TintHandler ΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Sprint())
    UseJSONTags = true
)

Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π° (4 Ρ‚ΠΈΠΏΠ°)

const (
    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Π° JSON, эксплуатируСтся slog.JSONHandler
    LogFormatJSON = "json"
    LogFormatProd = "prod"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Π° Logfmt, эксплуатируСтся slog.TextHandler
    LogFormatText   = "text"
    LogFormatSlog   = "slog"
    LogFormatLogfmt = "logfmt"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Π° HumanText, эксплуатируСтся кастомный TintHandler
    LogFormatTint   = "tint"
    LogFormatTinted = "tinted"
    LogFormatHuman  = "human"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Π°, прСдоставляСмый Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Go ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    LogFormatStd     = "std"
    LogFormatDefault = "default"
)

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅, добавляСмыС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ IdHandler

const (
    // ΠšΠ»ΡŽΡ‡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ (Ссли GoId=true)
    GoKey = "goroutine"

    // ΠšΠ»ΡŽΡ‡ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ (Ссли LogId=true)
    IdKey = "logId"

    // ΠšΠ»ΡŽΡ‡ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ (Ссли SumAlone=true)
    SumKey = "logSum"
)

Π£Ρ€ΠΎΠ²Π½ΠΈ логирования

DEBUG, INFO, WARN, ERROR - распространСнныС (стандартныС) ΡƒΡ€ΠΎΠ²Π½ΠΈ (slog)
TRACE - распространСнный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ для трассировки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ
FLOOD - нСстандартный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΆΡƒΡ€Π½Π°Π»
NOTICE, CRIT, ALERT, EMERG - ΡƒΡ€ΠΎΠ²Π½ΠΈ принятыС Π² syslog
FATAL - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ прСрывания выполнСния (ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с log.Fatal())
PANIC - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠ°Π½ΠΈΠΊΠΈ
SILENT - Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Турналирования вовсС
const (
    LevelFlood  = slog.Level(-12) // FLOOD  (-12)
    LevelTrace  = slog.Level(-8)  // TRACE  (-8)
    LevelDebug  = slog.LevelDebug // DEBUG  (-4)
    LevelInfo   = slog.LevelInfo  // INFO   (0)
    LevelNotice = slog.Level(2)   // NOTICE (2)
    LevelWarn   = slog.LevelWarn  // WARN   (4)
    LevelError  = slog.LevelError // ERROR  (8)
    LevelCrit   = slog.Level(10)  // CRIT   (10)
    LevelAlert  = slog.Level(12)  // ALERT  (12)
    LevelEmerg  = slog.Level(14)  // EMERG  (14)
    LevelFatal  = slog.Level(16)  // FATAL  (16)
    LevelPanic  = slog.Level(18)  // PANIC  (18)
    LevelSilent = slog.Level(20)  // SILENT (20)
)

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ логирования для прСдставлСния Π² структурС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

const (
    LvlFlood  = "flood"
    LvlTrace  = "trace"
    LvlDebug  = "debug"
    LvlInfo   = "info"
    LvlNotice = "notice"
    LvlWarn   = "warn"
    LvlError  = "error"
    LvlCrit   = "crit"
    LvlAlert  = "alert"
    LvlEmerg  = "emerg"
    LvlFatal  = "fatal"
    LvlPanic  = "panic"
    LvlSilent = "silent"
)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ограничитСля (Rate Limiter'Π°) ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

const (
    DEFAULT_RATE_LIMIT_MAX_NUM     = 100  // максимальноС число ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… сообщСний [ΡˆΡ‚]
    DEFAULT_RATE_LIMIT_INTERVAL_MS = 1000 // Π·Π° Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ [мс]

    // ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… сгруппированных сообщСний [мс]
    DEFAULT_RATE_LIMIT_FLUSH_PERIOD_MS = 3000
)

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для записСй Π² ΠΆΡƒΡ€Π½Π°Π»Π΅, сгруппрованных с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Rate Limiter'Π°

const (
    // ΠšΠ»ΡŽΡ‡ для числа сообщСний ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΠ΄Π½ΠΎ Π² случаС срабатывания
    // ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ RateLimiter'Π°.
    // ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ большС 1.
    RepeatedKey = "repeated"

    // ΠšΠ»ΡŽΡ‡ для Π±ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, пСрСдаСтся, Ссли сообщСниС Π±Ρ‹Π»ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠ°Π½ΠΎ
    // Π½ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ объСдинСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹ΠΌΠΈ сообщСниями.
    DelayedKey = "delayed"

    // ΠšΠ»ΡŽΡ‡ для Π±ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ,
    // Ρ‡Ρ‚ΠΎ выброс Π·Π°Π΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹Ρ… сообщСний Π² ΠΆΡƒΡ€Π½Π°Π» Π±Ρ‹Π» Π²
    // соотвСтствии с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ FlushPeriodMs
    FlushedKey = "flushed"
)

Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ для TintHanler'Π°

const (
    // ΠœΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ°ΠΊ Ρƒ стандартного Π»ΠΎΠ³Π³Π΅Ρ€Π° Π² Go
    StdTime  = "2006/01/02 15:04:05"
    DateTime = time.DateTime // "2006-01-02 15:04:05"

    // Бтандартная ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с миллисСкундами
    StdTimeMilli  = "2006/01/02 15:04:05.999"
    DateTimeMilli = "2006-01-02 15:04:05.999"

    // Бтандартная ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с микросСкундами
    StdTimeMicro  = "2006/01/02 15:04:05.999999"
    DateTimeMicro = "2006-01-02 15:04:05.999999"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ RFC3339 с наносСкундами (slog.TextHandler ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)
    RFC3339Nano = time.RFC3339Nano // "2006-01-02T15:04:05.999999999Z07:00"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ RFC3339 с микросСкундами
    RFC3339Micro = "2006-01-02T15:04:05.999999Z07:00"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ RFC3339 с миллисСкундами
    RFC3339Milli = "2006-01-02T15:04:05.999Z07:00"

    // Волько врСмя с миллисСкундами
    TimeOnlyMilli = "15:04:05.999"

    // Волько врСмя с микросСкундами
    TimeOnlyMicro = "15:04:05.999999"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ простых Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… часов (ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с time.Kitchen)
    Office = "15:04"

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄Π°Ρ‚Π°+врСмя Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² (с долями сСкунд)
    File    = "2006-01-02_15.04.05"
    Home    = "2006-01-02_15.04.05.9"
    Lab     = "2006-01-02_15.04.05.999"
    Science = "2006-01-02_15.04.05.999999"
    Space   = "2006-01-02_15.04.05.999999999"
)

ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

const DefaultEnvPrefix = "LOG_"

ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ для Ρ„Π»Π°Π³ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

const DefaultFlagPrefix = "log-"

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ логирования ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

const DefaultLevel = slog.LevelInfo

ΠšΠ»ΡŽΡ‡ для ошибки Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ΠΏΡ€ΠΈ использовании ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Err()

const ErrKey = "err"

Variables

Ошибка: Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Ρ…Π΅Π½Π΄Π»Π΅Ρ€ (nil)

var ErrNilHandler = errors.New("handler is nil")

Ошибка: "ротация Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π½Π΅ прСдусмотрСна ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ"

var ErrNotRotatable = errors.New("logger is not rotatable")

func Alert

func Alert(msg string, args ...any)

Alert записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelAlert)

func Alertf

func Alertf(format string, args ...any)

Alertf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelAlert)

func Checksum(sum uint16, full, timeOn bool, r slog.Record, logId uuid.UUID) uint16

Checksum вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму (Π½Π° основС CRC16) записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² (full=true/false).

На Π²Ρ…ΠΎΠ΄Π΅:

full - ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ для вычислСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΏΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ рСкурсивно
sum - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи ΠΈΠ»ΠΈ 0
timeOn - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² расчСт CRC ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
r - подготовлСнная для Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π² slog-ΠΆΡƒΡ€Π½Π°Π» запись
logId - UUID записи

func ChecksumAttr(key string, value any) uint16

ChecksumAttr вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму записи для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° key/value. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма вычисляСтся рСкурсивно для всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур с использованиСм рСфлСксии. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы смСТных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 2 (XOR). ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы key ΠΈ value ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ слоТСния Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.

func ChecksumAttrSlog(key string, value slog.Value) uint16

ChecksumAttrSlog - вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму записи для ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° slog key/value. АнализируСтся Ρ‚ΠΈΠΏ slog значСния ΠΈ Ссли Ρ‚ΠΈΠΏ, Π½Π΅ стандартный (см. slogg.Kind) примСняСтся рСфлСксия (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ рассчитываСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ). ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма вычисляСтся рСкурсивно для всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы смСТных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 2 (XOR). ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы key ΠΈ value ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ слоТСния Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ key ΠΈ slog.Value. Ѐункция ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ slog Π³Ρ€ΡƒΠΏΠΏΡ‹.

func ChecksumFull(sum uint16, timeOn bool, r slog.Record, logId uuid.UUID) uint16

ChecksumFull вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма вычисляСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ JSON.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ суммы для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 2 (XOR), Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ обСспСчиваСтся ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ суммы Π² случаС пСрСстановки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌΠΈ. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ формируСтся ΠΏΡƒΡ‚Π΅ΠΌ простого слоТСния Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ CRC16 сумм. ΠŸΠ΅Ρ€Π΅Π΄ вычислСниСм CRC16 ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ приводится ΠΊ строкС.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя:

  • Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ Π² RFC3339Milli, Ссли timeOn=true (time=<string>);
  • ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сообщСния ΠΆΡƒΡ€Π½Π°Π»Π° (level=<int>)
  • тСкст сообщСния r.Message (msg=<string>)
  • "Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ сумму" всСх Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π΅ Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ Π»ΡŽΠ±Ρ‹Ρ… пСрСстановок
  • ΠΏΠ΅Ρ€Π²Ρ‹Π΅ (ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅) 14 Π±Π°ΠΉΡ‚ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° (logId=<bytes>)

На Π²Ρ…ΠΎΠ΄Π΅:

sum - Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΈΠ»ΠΈ 0
timeOn - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² расчСт суммы ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
r - подготовлСнная для Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π² slog-ΠΆΡƒΡ€Π½Π°Π» запись
logId - UUID записи

func ChecksumSimple(sum uint16, timeOn bool, r slog.Record, logId uuid.UUID) uint16

ChecksumSimple вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму (CRC16) записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅. ΠšΠΎΠ½Ρ‚Ρ€Π»ΡŒΠ½Π°Ρ сумма Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя:

  • time (RFC3339Milli ΠΈΠ»ΠΈ RFC3339Micro ΠΊΠ°ΠΊ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅)
  • level (ΠΊΠ°ΠΊ строка Ρ‚ΠΈΠΏΠ° ERROR, WARN ΠΈ Ρ‚.ΠΏ.)
  • msg (ΠΊΠ°ΠΊ строка)
  • logId (ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ 14 Π±Π°ΠΉΡ‚)
  • err, Ссли Π΅ΡΡ‚ΡŒ (ΠΊΠ°ΠΊ строку)

На Π²Ρ…ΠΎΠ΄Π΅:

sum - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи ΠΈΠ»ΠΈ 0
timeOn - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² расчСт CRC ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
r - подготовлСнная для Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π² slog-ΠΆΡƒΡ€Π½Π°Π» запись
logId - UUID записи

func Crit

func Crit(msg string, args ...any)

Crit записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelCrit)

func Critf

func Critf(format string, args ...any)

Critf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelCrit)

func Debug

func Debug(msg string, args ...any)

Debug записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelDebug)

func Debugf

func Debugf(format string, args ...any)

Debugf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelDebug)

func Emerg

func Emerg(msg string, args ...any)

Emerg записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelEmerg)

func Emergf

func Emergf(format string, args ...any)

Emergf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelEmerg)

func Env

func Env(conf *Conf, prefixOpt ...string)

Env - ΠΎΠ±ΠΎΠ³Π°Ρ‰Π°Π΅Ρ‚ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния.

conf - обогащаСмая структура ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π°
prefixOpt - ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ прСфикс (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ "LOG_")

ΠΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с инвСрсиСй) полям структуры Conf:

LOG_LEVEL       (string/int: "debug", "trace", "error", "0", "-20"...)
LOG_PIPE        (string: "stdout", "stderr", "null")
LOG_FILE        (string: ~"logs/app.log")
LOG_FILE_MODE   (string: ~"0640")
LOG_FORMAT      (string: "json", "logfmt", "tinted", "default")
LOG_GOID        (bool)
LOG_ID          (bool)
LOG_SUM         (bool)
LOG_SUM_FULL    (bool)
LOG_SUM_CHAIN   (bool)
LOG_SUM_ALONE   (bool)
LOG_TIME        (bool)
LOG_TIME_LOCAL  (bool)
LOG_TIME_MICRO  (bool)
LOG_TIME_FORMAT (string: "default", "lab", "15.04.05"...)
LOG_SRC         (bool)
LOG_SRC_PKG     (bool)
LOG_SRC_FUNC    (bool)
LOG_SRC_EXT     (bool)
LOG_COLOR       (bool)
LOG_LEVEL_OFF   (bool)
LOG_ROTATE      (bool)
LOG_ROTATE_MAX_SIZE    (int: ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚)
LOG_ROTATE_MAX_AGE     (int: суток)
LOG_ROTATE_MAX_BACKUPS (int: число Ρ„Π°ΠΉΠ»ΠΎΠ²)
LOG_ROTATE_LOCAL_TIME  (bool)
LOG_ROTATE_COMPRESS    (bool)

Для получСния bool Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция StringToBool(), Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ "Π²ΠΎΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ", ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… true/false.

Если ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ пСрСмСнная окруТСния Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π° (ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ пустой строки), Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ структуры Conf Π½Π΅ модифицируСтся.

ВиповоС использованиС:

conf := xlog.Conf{}   // ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π°
xlog.Env(&conf)       // ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния

func Err

func Err(err error) slog.Attr

Err Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ slog.Attr с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "err" Ссли err != nil ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "пустой" Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Ссли err == nil. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ записи Ρ‚ΠΈΠΏΠ° "err=nil".

func Error

func Error(msg string, args ...any)

Error записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelError)

func Errorf

func Errorf(format string, args ...any)

Errorf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelError)

func Fatal

func Fatal(msg string, args ...any)

Fatal записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelFatal) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° os.Exit(1)

func Fatalf

func Fatalf(format string, args ...any)

Fatalf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelFatal) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° os.Exit(1)

func Flood

func Flood(msg string, args ...any)

Flood записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelFlood)

func Floodf

func Floodf(format string, args ...any)

Floodf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelFlood)

func GetLevel() slog.Level

GetLevel Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования для глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func GetLvl

func GetLvl() string

GetLvl Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования глобального Π»ΠΎΠ³Π³Π΅Ρ€Π° Π² Π²ΠΈΠ΄Π΅ строки Π²ΠΈΠ΄Π° "info", "debug" ΠΈ Ρ‚.ΠΏ.

func Info

func Info(msg string, args ...any)

Info записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelInfo)

func Infof

func Infof(format string, args ...any)

Infof записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelInfo)

func Int

func Int(key string, value int) slog.Attr

Int Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ slog.Attr, Ссли key != "" ΠΈ value != 0 ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "пустой" Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. Данная ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° позволяСт ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»Π° Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния.

func IsRotatable() bool

IsRotatable Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ возмоТности Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° для лобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func LevelFromLabel(label string) slog.Level

LevelFromLabel ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΊΡƒ уровня логирования (INFO, WARN, ...) Π² числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вострСбована для парсинга Π»ΠΎΠ³ΠΎΠ². Π’Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π° "ERROR+2", принятого Π² slog.

func LevelFromString(level string) slog.Level

LevelFromString ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ уровня логирования ("debug", "info", "0" ΠΈ Π΄Ρ€.), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² структурС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊ slog.Level. Ѐункция Π½Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π° Π² рСгистру. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ логирования ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ строкой, Ρ‚Π°ΠΊ ΠΈ дСсятичным Ρ†Π΅Π»Ρ‹ΠΌ числом.

func LevelToColorLabel(level slog.Level) string

LevelToColorLabel ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования ΠΊ строкС/ΠΌΠ΅Ρ‚ΠΊΠ΅ для прСдставлСния Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Escape/Ansi символов подсвСтки. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² TintHandler'Π΅, Ссли Π² структурС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf Π·Π°Π΄Π°Π½Ρ‹ Format="tinted" ΠΈ Color=true. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ (FLOOD, EMERG, ALERT ΠΈ Π΄Ρ€.).

func LevelToLabel(level slog.Level) string

LevelToLabel ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования ΠΊ строкС/ΠΌΠ΅Ρ‚ΠΊΠ΅ для прСдставлСния Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ("INFO", "ERROR" ΠΈ Π΄Ρ€.) Π² стилС slog, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ String() Ρ‚ΠΈΠΏΠΎΠ² slog.Level/slog.LevelVar. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ (TRACE, NOTICE, CRIT ΠΈ Π΄Ρ€.).

func LevelToString(level slog.Level) string

LevelToString ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ уровня логгирования slog.Level ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ Π²ΠΈΠ΄Π΅ строки Π² структурС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Если Π·Π°Π΄Π°Π½ Π½Π΅ извСстный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, Ρ‚ΠΎ возвращаСтся Π΅Π³ΠΎ дСсятичноС прСдставлСниС.

func Log

func Log(ctx context.Context, level slog.Level, msg string, args ...any) error

Log записываСт сообщСниС Π² структурированный ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ контСкстом

func LogAttrs(ctx context.Context, level slog.Level, msg string, attrs ...slog.Attr) error

LogAttr записываСт сообщСниС с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Π² структурированный ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ контСкстом

func Logf

func Logf(level slog.Level, format string, args ...any)

Log записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования

func NewHandler(conf Conf, writer io.Writer, mws ...Middleware) (handler slog.Handler, _ *slog.LevelVar)

NewHandler создаёт Π½ΠΎΠ²Ρ‹ΠΉ *slog.Handler Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ conf с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ writer. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ…Π΅Π½Π΄Π»Π΅Ρ€ Π² соотвСтствии с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (goroutine, logId, logSum, repeated). Π—Π°ΠΎΠ΄Π½ΠΎ возвращаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° slog.LevelVar для возмоТности бСзопасного управлСния ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

conf - ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π°
writer - ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ ΠΆΡƒΡ€Π½Π°Π»Π°
mws - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hanlde() интСрфСйса slog.Handler

func NewLog

func NewLog(conf Conf) *log.Logger

NewLog создаСт стандартный (legacy) Π»ΠΎΠ³Π³Π΅Ρ€ ΠΈ настраиваСт Π΅Π³ΠΎ с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf для X-logger

func NewLogWriter(ctx context.Context, logger *slog.Logger, level slog.Level) io.Writer

NewLogWiter создаСт io.Writer Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ slog Π»ΠΎΠ³Π³Π΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования. ЗаписываСмыС Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ io.Wtiter Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ slog.Logger Π² Π²ΠΈΠ΄Π΅ сообщСний (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚). Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для построСния legacy Π»ΠΎΠ³Π³Π΅Ρ€ΠΎΠ² Π½Π° основС ΠΏΠ°ΠΊΠ΅Ρ‚Π° "log" с ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»Π° Π² структурированный ΠΆΡƒΡ€Π½Π°Π» slog.

func NewStdHandler(conf Conf, mws ...Middleware) (slog.Handler, *slog.LevelVar)

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ…Π΅Π½Π΄Π»Π΅Ρ€ стандартного slog Π»ΠΎΠ³Π³Π΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ управлСния ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования ΠΈ с Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (goroutine, logId, logSum) ΠΈ middleware

conf - ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π°
mws - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hanlde() интСрфСйса slog.Handler

func Notice

func Notice(msg string, args ...any)

Notice записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelNotice)

func Noticef

func Noticef(format string, args ...any)

Noticef записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelNotice)

func Panic

func Panic(msg string)

Panic записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelPanic) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° panic()

func Rotate

func Rotate() error

Rotate ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° (Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ) для глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… прилоТСниях Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ротация Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎ сигналу SIGHUP.

func SetLevel(level slog.Level)

SetLevel обновляСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования для глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func SetLvl

func SetLvl(level string)

SetLvl обновляСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования глобального Π»ΠΎΠ³Π³Π΅Ρ€Π° Π½Π° основС строки ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ‚ΠΈΠΏΠ° "trace", "error" ΠΈ Ρ‚.ΠΏ.

func Setup

func Setup(conf Conf)

Setup - ΠΌΠ΅Π³Π° функция, которая настраиваСт всС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹ Π² соотвСтствии с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структурой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf. Ѐункция ΠΏΠΎΡ‚ΠΎΠΊΠΎ Π½Π΅ бСзопасная!

func SetupLog(logger *log.Logger, conf Conf)

SetupLog ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ настройку стандартного *log.Logger Π½Π° основС ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf для "Client Logger" с Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ» с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ (Ссли прСдусмотрСно ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ). Ѐункция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ NewWriter() ΠΈ SetupLogWithWriter().

func SetupLogWithWriter(logger *log.Logger, conf Conf, writer io.Writer)

SetupLogWithWriter ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ настройку стандартного *log.Logger Π½Π° основС ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf для "Client Logger" с Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ io.Writer вмСсто Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

func Slog

func Slog() *slog.Logger

Slog Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ *slog.Logger ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ (глобального) Π»ΠΎΠ³Π³Π΅Ρ€Π°

func SlogWithFields(log *slog.Logger, fields ...FieldsProvider) *slog.Logger

SlogWithFields создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ *slog.Logger с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

log - исходной slog Π»ΠΎΠ³Π³Π΅Ρ€
fields - интСрфСйс для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

func Sprint

func Sprint(val any) string

Sprint - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ структуру Π΄Π°Π½Π½Ρ‹Ρ… Π² строку Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π±Π»ΠΈΠ·ΠΊΠΎΠΌ ΠΊ стандартному Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ "%+v", Π½ΠΎ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСфлСксия. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ JSON Ρ‚Π΅Π³ΠΈ (Ссли UseJSONTags=true) Ѐункция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отобраТСния структур Π΄Π°Π½Π½Ρ‹Ρ… Π² TintHandler'Π΅.

val - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ структуры, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ
Π½Π° структуры, ошибки ΠΈ ΠΊΠ°Ρ€Ρ‚Ρ‹.

func String

func String(key, value string) slog.Attr

String Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ slog.Attr, Ссли key != "" ΠΈ value != "" ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "пустой" Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. Данная ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° позволяСт ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»Π° пустыС строки.

func StringToBool(s string) bool

StringToBool ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку Π² Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Допустимы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

true:  "true", "True", "yes", "YES", "on", "1", "2", "99"
false: "false", "FALSE", "no", "Off", "0", "Abra-Cadabra"

Π’ случаС ошибки (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) возвращаСтся false. Ѐункция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΈ Ρ„Π»Π°Π³ΠΎΠ².

func StringToInt(s string) int

StrintToInt ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку ΠΊ Ρ†Π΅Π»ΠΎΠΌΡƒ числу. Π’ случаС ошибки возвращаСтся 0. Ѐункция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния ΠΈ Ρ„Π»Π°Π³ΠΎΠ².

func TimeFormat(alias string) (format string, ok bool)

TimeFormat Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку форматирования Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ Π² соотвСтствии с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ строкой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (псСвдоним) обрабатываСтся Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° рСгистра. Если псСвдоним Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎ входная строка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Go Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ (аля "2006-01-02 15:04:05").

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ok=true, Ссли псСвдоним Π½Π°ΠΉΠ΄Π΅Π½. Ѐункция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Tinted Ρ…Π΅Π½Π΄Π»Π΅Ρ€Π°. Допустимы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ псСвдонимы:

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Go начиная с вСрсии go1.20:
"Layout":        time.Layout       "01/02 03:04:05PM '06 -0700"
"ANSIC":         time.ANSIC        "Mon Jan _2 15:04:05 2006"
"UnixDate":      time.UnixDate     "Mon Jan _2 15:04:05 MST 2006"
"RubyDate":      time.RubyDate     "Mon Jan 02 15:04:05 -0700 2006"
"RFC822":        time.RFC822       "02 Jan 06 15:04 MST"
"RFC822Z":       time.RFC822Z      "02 Jan 06 15:04 -0700"
"RFC850":        time.RFC850       "Monday, 02-Jan-06 15:04:05 MST"
"RFC1123":       time.RFC1123      "Mon, 02 Jan 2006 15:04:05 MST"
"RFC1123Z":      time.RFC1123Z     "Mon, 02 Jan 2006 15:04:05 -0700"
"RFC3339":       time.RFC3339      "2006-01-02T15:04:05Z07:00"
"RFC3339Nano":   time.RFC3339Nano  "2006-01-02T15:04:05.999999999Z07:00"
"Kitchen":       time.Kitchen      "3:04PM"
"Stamp":         time.Stamp        "Jan _2 15:04:05"
"StampMilli":    time.StampMilli   "Jan _2 15:04:05.000"
"StampMicro":    time.StampMicro   "Jan _2 15:04:05.000000"
"StampNano":     time.StampNano    "Jan _2 15:04:05.000000000"
"DateTime":      time.DateTime     "2006-01-02 15:04:05"
"DateTimeMilli": DateTimeMilli     "2006-01-02 15:04:05.999"
"DateTimeMicro": DateTimeMicro     "2006-01-02 15:04:05.999999"
"DateOnly":      time.DateOnly     "2006-01-02"
"TimeOnly":      time.TimeOnly     "15:04:05"

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, прСдоставляСмыС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ xlog:
"StdTime":       StdTime        "2006/01/02 15:04:05"
"StdTimeMilli":  StdTimeMilli   "2006/01/02 15:04:05.999"
"StdTimeMicro":  StdTimeMicro   "2006/01/02 15:04:05.999999"
"RFC3339Micro":  RFC3339Micro   "2006-01-02T15:04:05.999999Z07:00"
"RFC3339Milli":  RFC3339Milli   "2006-01-02T15:04:05.999Z07:00"
"TimeOnlyMicro": TimeOnlyMicro  "15:04:05.999999"
"TimeOnlyMilli": TimeOnlyMilli  "15:04:05.999"
"Default":       StdTimeMilli   "2006/01/02 15:04:05.999"
"DefaultMicro":  StdTimeMicro   "2006/01/02 15:04:05.999999
"File":          File           "2006-01-02_15.04.05"
"Office":        Office         "15:04" по аналогии с "Kitchen" в Go
"Home":          Home           "2006-01-02_15.04.05.9"
"Lab":           Lab            "2006-01-02_15.04.05.999"
"Science":       Science        "2006-01-02_15.04.05.999999"
"Space":         Space          "2006-01-02_15.04.05.999999999"

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅:
"" (пустая строка), "off", "no", "false", "disable", "0"

func Trace

func Trace(msg string, args ...any)

Trace записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelTrace)

func Tracef

func Tracef(format string, args ...any)

Tracef записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelTrace)

func Value

func Value(value any) slog.Value

Value - ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ slog.Value ΠΈΠ· any

func Warn

func Warn(msg string, args ...any)

Warn записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelWarn)

func Warnf

func Warnf(format string, args ...any)

Warnf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (LevelWarn)

ChecksumRes - это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы JSON записи. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ²Π΅Ρ€ΠΈΡ‚ΡŒ поля LogSum ΠΈ Sum. ЗаполняСтся ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ChecksumVerify().

type ChecksumRes struct {
    Time      time.Time      // ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ записи
    Level     slog.Level     // ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сообщСния
    Source    map[string]any // ссылка Π½Π° исходныС тСксты (Ссли Π΅ΡΡ‚ΡŒ)
    Message   string         // сообщСниС ΠΆΡƒΡ€Π½Π°Π»Π°
    Goroutine int            // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ (Ссли Π΅ΡΡ‚ΡŒ)
    LogId     uuid.UUID      // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅
    Err       string         // ошибка Π² сообщСнии с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "err"
    LogSum    uint16         // ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма извлСчСнная ΠΈΡ… ΠΆΡƒΡ€Π½Π°Π»Π°
    Sum       uint16         // ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма вычислСнная
}

func ChecksumVerify(full bool, rec map[string]any) (ChecksumRes, error)

ChecksumVerify ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ вычислСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы JSON записи ΠΈ заполняСт структуру ChecksumRes. Ошибка возвращаСтся, Ссли Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°ΡΠΏΠ°Ρ€ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Sum ΠΈ LogSum Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ внСшний ΠΊΠΎΠ΄ (ΠΏΡ€ΠΈ нСсовпадСнии ошибка Π½Π΅ возвращаСтся). Если Π² записи ΠΆΡƒΡ€Π½Π°Π»Π° Π½Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ logId, ΠΈ logSum, Ρ‚ΠΎ возвращаСтся ошибка.

full - ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ для вычислСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΏΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ рСкурсивно
rec - запись извлСкаСмая ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JSON Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π°

func ChecksumVerifyFull(rec map[string]any) (ChecksumRes, error)

ChecksumVerifyFull ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ вычислСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы JSON записи ΠΈ заполняСт структуру ChecksumRes. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма вычисляСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ JSON.

Ошибка возвращаСтся, Ссли Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°ΡΠΏΠ°Ρ€ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Sum ΠΈ LogSum Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ внСшний ΠΊΠΎΠ΄ (ΠΏΡ€ΠΈ нСсовпадСнии ошибка Π½Π΅ возвращаСтся). Если Π² записи ΠΆΡƒΡ€Π½Π°Π»Π° Π½Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ logId, ΠΈ logSum, Ρ‚ΠΎ возвращаСтся ошибка.

rec - запись извлСкаСмая ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JSON Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π°

func ChecksumVerifySimple(rec map[string]any) (ChecksumRes, error)

ChecksumVerify ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ вычислСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы JSON записи ΠΈ заполняСт структуру ChecksumRes. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма вычисляСтся ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ Π½Π΅ ΠΏΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ JSON (time, level, msg, logId, err).

Ошибка возвращаСтся, Ссли Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°ΡΠΏΠ°Ρ€ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Sum ΠΈ LogSum Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ внСшний ΠΊΠΎΠ΄ (ΠΏΡ€ΠΈ нСсовпадСнии ошибка Π½Π΅ возвращаСтся). Если Π² записи ΠΆΡƒΡ€Π½Π°Π»Π° Π½Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ logId, ΠΈ logSum, Ρ‚ΠΎ возвращаСтся ошибка.

rec - запись извлСкаСмая ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JSON Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π°

func (ChecksumRes) SourceToString

func (res ChecksumRes) SourceToString() string

SourceToString - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ map/JSON прСдставлСниС ссылки Π½Π° исходныС тСксты (file/function/line) Π² строку Π²ΠΈΠ΄Π° "file:function():line". Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ поля Source структуры ChecksumRes.

type Conf

Conf - структура ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для настройки Π»ΠΎΠ³Π³Π΅Ρ€Π°

type Conf struct {
    // Π—Π°Π΄Π°Π½Π½Ρ‹ΠΉ исходный ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Турналирования.
    // ЗадаСтся ΠΈΠ»ΠΈ строкой (trace/debug/info/warn/error/crit/fatal/...),
    // ΠΈΠ»ΠΈ строкой содСрТащСй Ρ†Π΅Π»ΠΎΠ΅ дСсятичноС число Π² Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ `slog.Level`
    // (см. константы Ρ‚ΠΈΠΏΠ° LogLevelTrace/LogLevelInfo/...).
    // Доступ ΠΊ полю Level структуры Logger позволяСт ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ
    // логирования Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
    // ΠŸΡƒΡΡ‚Π°Ρ строка интСрпрСтируСтся ΠΊΠ°ΠΊ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ "info".
    //
    //  flood  = slog.Level(-12) - Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Турналирования
    //  trace  = slog.Level(-8)  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ трассировки всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² (syslog)
    //  debug  = slog.LevelDebug - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ сообщСний (опытная эксплуатация)
    //  info   = slog.LevelInfo  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… сообщСний (эксплуатация)
    //  notice = slog.Level(2)   - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹Ρ… ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ (syslog)
    //  warn   = slog.LevelWarn  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ
    //  error  = slog.LevelError - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ стандартных ошибок
    //  crit   = slog.Level(10)  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ критичСских ошибок
    //  alert  = slog.Level(12)  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ошибок (syslog)
    //  emerg  = slog.Level(14)  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π°Π²Π°Ρ€ΠΈΠΈ (syslog)
    //  fatal  = slog.Level(16)  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½Ρ‹Ρ… ошибок с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    //  panic  = slog.Level(18)  - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½Ρ‹Ρ… сообщСний ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ°Π½ΠΈΠΊΠΎΠΉ
    //  silent = slog.Level(20)  - полная Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ сообщСний Π² ΠΆΡƒΡ€Π½Π°Π»
    Level string `json:"level"`

    // Π—Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ("stdout", "stderr", "null" ΠΈΠ»ΠΈ пустая строка).
    // Если ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π·Π°Π΄Π°Π½ (пустая строка) ΠΈ Π½Π΅ Π·Π°Π΄Π°Π½ Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° (пустая
    // строка), Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ "stdout" (дСйствиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ).
    // ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ установкой
    // Pipe="null" ΠΈ File="".
    Pipe string `json:"pipe"`

    // Π—Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° (пустая строка, Ссли Π½Π΅ Π·Π°Π΄Π°Π½).
    // Если Π·Π°Π΄Π°Π½ File, Π° Pipe="", Ρ‚ΠΎ ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ производится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ
    // Π² Ρ„Π°ΠΉΠ». Если явно Π·Π°Π΄Π°Ρ‚ΡŒ Pipe (stdout ΠΈΠ»ΠΈ stderr) ΠΈ File, Ρ‚ΠΎ
    // ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π΄Π²ΡƒΡ… направлСниях.
    // К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΠΎΡ‚ΠΎΠΊ stdout ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ systemd/journald,
    // Π° для ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ заданная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° хранСния
    // ΠΈ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ.
    File string `json:"file"`

    // ΠŸΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΆΡƒΡ€Π½Π°Π»Π° (строка Π² Π²ΠΎΡΡŒΠΌΠ΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ Unix Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ).
    // Если FileMode - пустая строка, Ρ‚ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²Π° 0640
    // (см. константу FileModeDefault).
    // Если, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²Π° доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΆΡƒΡ€Π½Π°Π»Π°
    // всСм ΠΊΡ€ΠΎΠΌΠ΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ "0600".
    // Если трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ доступныС для чтСния всСм, Ρ‚ΠΎ допустимо
    // ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "0644".
    // Π’ случаС ошибки прСобразования Π΄Π°Π½Π½ΠΎΠΉ строки (Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ символы),
    // ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ самыС "строгиС" ΠΏΡ€Π°Π²Π° доступа 0600
    // (см. константу FileModeOnError).
    FileMode string `json:"file-mode"`

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΆΡƒΡ€Π½Π°Π»Π° ("json", "logfmt", "tinted", "default").
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ "tinted" (!).
    // ВмСсто "json" допускаСтся псСвдоним "prod".
    // ВмСсто "logfmt" Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ псСвдонимы "slog" ΠΈ "text".
    // ВмСсто "tinted" Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ псСвдонимы "tint" ΠΈ "human".
    // ВмСсто "default" допускаСтся псСвдоним "std".
    // Для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° JSON ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ slog.JSONHandler.
    // Для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Logfmt - slog.TextHandler.
    // Для Tinted - кастомный TintHandler.
    // Для Default - slog.defaultHandler "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Go".
    // Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ JSON ΠΈ Logfmt - это ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Π΅ стандарты для ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ².
    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ Tinted - ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для стСндовой ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΡƒΠ΄ΠΎΠ±Π΅Π½ для
    // Π°Π½Π°Π»ΠΈΠ·Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ (Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ,
    // Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ANSI/Escape подкраску).
    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ Default сохранСн для совмСстимости с ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ прилоТСниями,
    // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ log/slog Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ настроСк.
    // РСгистр строки Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
    Format string `json:"format"`

    // Π”ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ запись Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "goroutine"
    GoId bool `json:"go-id"`

    // ΠžΠ±ΠΎΠ³Π°Π΄ΠΈΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ запись.
    // К ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ добавляСтся UUIDv7
    // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "logId". Π’ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ младшиС Π±ΠΈΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚
    // Π±Ρ‹Ρ‚ΡŒ пСрСзаписаны ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммой.
    IdOn bool `json:"id-on"`

    // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π» ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи.
    // ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма помСщаСтся Π² младшиС Π±ΠΈΡ‚Ρ‹ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ
    // Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ добавляСтся Π² ΠΆΡƒΡ€Π½Π°Π» с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "logSum".
    SumOn bool `json:"sum-on"`

    // Π’Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму ΠΏΠΎ Π’Π‘Π•Πœ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ рСкурсивно.
    // ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ слоТный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ
    // вычислСния ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы.
    SumFull bool `json:"sum-full"`

    // Π’Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму с использованиСм Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния
    // ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅.
    // Данная опция позволяСт ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ систСматичСскиС ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΈΠ»ΠΈ
    // ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρƒ записСй Π² ΠΆΡƒΡ€Π½Π°Π»Π΅.
    SumChain bool `json:"sum-chain"`

    // НС ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму (КБ) Π² младшиС Π±ΠΈΡ‚Ρ‹ UUID
    // ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° записи (Ρ‡Ρ‚ΠΎ дСлаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ).
    // ΠŸΡ€ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ КБ Π² UUID Π΅ΡΡ‚ΡŒ нСбольшая Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ
    // монотонности возрастания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚ записи ΠΊ записи.
    // Π‘ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ КБ записываСтся Π² ΠΆΡƒΡ€Π½Π°Π» ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ с
    // ΠΊΠ»ΡŽΡ‡ΠΎΠΌ "logSum" Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.
    SumAlone bool `json:"sum-alone"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (timestamp) Π² ΠΆΡƒΡ€Π½Π°Π».
    // Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ трСбуСтся. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ
    // ΠΏΡ€ΠΈ сохранСнии записСй Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ systemd/journald ΠΊ Π½ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΊΠ°
    // Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ добавляСтся автоматичСски ΠΈ этого достаточно.
    TimeOff bool `json:"time-off"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ использования локального Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² ΠΌΠ΅Ρ‚ΠΊΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
    // (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ UTC)
    TimeLocal bool `json:"time-local"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ использования ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с микросСкундами.
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Tinted/JSON/Logfmt
    // указываСтся с миллисСкундами. Для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Default Π΄ΠΎΠ»ΠΈ сСкунд
    // Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. Данная опция "унаслСдована" Π΅Ρ‰Π΅ ΠΎΡ‚ legacy
    // Π»ΠΎΠ³Π³Π΅Ρ€Π° ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° "log".
    TimeMicro bool `json:"time-micro"`

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для TintHandler'Π° (Ссли Format="tinted").
    // Π”ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ значСния Ρ‚ΠΈΠΏΠ° "Kitchen", "DateTime", "space" ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅,
    // ΠΈΠ»ΠΈ строка Π² стандартной Go-нотация для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²ΠΈΠ΄Π°
    // "2006-01-02_15.04.05.999".
    // ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ TimeFormat(), которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
    // Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
    // РСгистр строки Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
    TimeFormat string `json:"time-format"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΆΡƒΡ€Π½Π°Π» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ с ссылками Π½Π° исходныС тСксты
    // Π² мСстС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Турналирования (Ρ„Π°ΠΉΠ»:Π½ΠΎΠΌΠ΅Ρ€_строки).
    //
    // Π’ΠΠ˜ΠœΠΠΠ˜Π•: для сСрвисов Π¦Π£Π“Π˜ Π² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²ΠΎΠΉ срСдС Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    // Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠžΠ‘Π―Π—ΠΠ’Π•Π›Π¬ΠΠž Π·Π°Π΄Π°Π½ΠΎ ΠΊΠ°ΠΊ true для возмоТности обогащСния всСх
    // записСй ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ сСрвиса (ΠΏΠΎΠ»Π΅ id, см. Π½ΠΈΠΆΠ΅ SrcFields).
    Src bool `json:"src"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ добавлСния ΠΊ ΠΈΠΌΠ΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° с исходным тСкстом ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (ΠΏΠ°ΠΊΠ΅Ρ‚Π°)
    // (ΠΏΠ°ΠΊΠ΅Ρ‚/Ρ„Π°ΠΉΠ»:Π½ΠΎΠΌΠ΅Ρ€_строки)
    SrcPkg bool `json:"src-pkg"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ добавлСния Π² ΠΆΡƒΡ€Π½Π°Π» ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²) ΠΈΠ· контСкста ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…
    // осущСствляСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Турналирования
    // (ΠΏΠ°ΠΊΠ΅Ρ‚/Ρ„Π°ΠΉΠ»:функция():Π½ΠΎΠΌΠ΅Ρ€_строки)
    SrcFunc bool `json:"src-func"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ".go" Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² исходных тСкстов.
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ упраздняСтся для краткости.
    SrcExt bool `json:"src-ext"`

    // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ добавляСмыС Π² Π±Π»ΠΎΠΊ "source".
    // ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π±Π»ΠΎΠΊ source содСрТит поля file, function, line
    // (см. Ρ‚ΠΈΠΏ slog.Source), Π½ΠΎ имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ
    // Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.
    // ΠŸΡ€ΠΈΠΌΠ΅Ρ€: id="superService", ver="1.2.3", instanceId=1234.
    //
    // Π’ΠΠ˜ΠœΠΠΠ˜Π•: для сСрвисов Π¦Π£Π“Π˜ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ являСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚
    // id (строка), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
    // ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/сСрвис Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ
    // ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ комплСкса.
    SrcFields *Fields `json:"src-fields"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ "подкраски" ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ANSI/Escape
    // ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, Ссли Format="tinted"
    ColorOff bool `json:"color-off"`

    // ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΆΡƒΡ€Π½Π°Π» ΠΌΠ΅Ρ‚ΠΊΠΈ уровня Турналирования
    // (Ρ‚ΠΈΠΏΠ° level="INFO"). ΠœΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ
    // "Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ" Π»ΠΎΠ³Π³Π΅Ρ€Π° Π±Π΅Π· ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ логирования.
    LevelOff bool `json:"level-off"`

    // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ прСфикс для сообщСний legacy Π»ΠΎΠ³Π³Π΅Ρ€Π° (log.Print())
    Prefix string `json:"prefix"`

    // ΠšΠ»ΡŽΡ‡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния, добавляСмого ΠΊΠΎ всСм записям Π² ΠΆΡƒΡ€Π½Π°Π»Π΅
    AddKey string `json:"add-key"`

    // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, добавляСмоС ΠΊΠΎ всСм записям Π² ΠΆΡƒΡ€Π½Π°Π»Π΅
    AddValue any `json:"add-value"`

    // Настройка ограничитСля Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΆΡƒΡ€Π½Π°Π» большого числа сходных сообщСний
    // Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚.Π½. Rate Limiter.
    RateLimit RateLimitConf `json:"rateLimit"`

    // Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Ссли Π²Ρ‹Π²ΠΎΠ΄ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ»
    Rotate RotateConf `json:"rotate"`
}

type Fields

Fields - это простая ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° для наполнСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ Π½Π° основС ΠΊΠ°Ρ€Ρ‚ (key/value)

type Fields map[string]any

func (Fields) Args

func (fields Fields) Args() []any

Args ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Fields Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Log, Info, Debug, With ΠΈ Ρ‚.ΠΏ. ЗначСния nil ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π²Ρ‹Π²ΠΎΠ΄Π°.

func (Fields) Attrs

func (fields Fields) Attrs() []slog.Attr

Attrs ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Fields Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ []slog.Attr для Π²Ρ‹Π·ΠΎΠ²Π° высокоэффСктивного slog ΠΌΠ΅Ρ‚ΠΎΠ΄Π° LogAttrs. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil ΠΈ пустыС строки ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ.

func (Fields) Fields

func (f Fields) Fields() Fields

Fields Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ интСрфСйс FieldsProvider. Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Fields Π² качСствС FieldsProvider.

func (Fields) Value

func (fields Fields) Value() slog.Value

Value ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Fields Π² Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ slog.GroupValue()

FieldsProvider - ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс для прСдоставлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ key/value

type FieldsProvider interface {
    Fields() Fields
}

HandlerFunc - это Ρ‚ΠΈΠΏ основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Handle() интСрфСйса slog.Handler для ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ записи ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π»/Ρ„Π°ΠΉΠ»

type HandleFunc func(context.Context, slog.Record) error

IdHandler - это ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ slog.Handler'Π° для возмоТности обогащСния ΠΆΡƒΡ€Π½Π°Π»Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ (goroutine, logId, logSum). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, IdHandler ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Middleware для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Handle интСрфСйса slog.Handler.

type IdHandler struct {
    // contains filtered or unexported fields
}

func NewIdHandler(handler slog.Handler, opts *IdOptions, sum uint16, mws ...Middleware) *IdHandler

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Id-Ρ…Π΅Π½Π΄Π»Π΅Ρ€ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ для slog.Handler'Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π» Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ "goroutine", "logId" (Π½Π° основС UUID) ΠΈ "logSum" (ΠΏΡ€ΠΈ нСобходимости), Π° Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Handle() Π·Π°Π΄Π°Π½ΠΎΠ³ΠΎ handler'Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡Π½ΠΎΠΉ Middleware.

handler - ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ slog handler
opts - ΠΎΠΏΡ†ΠΈΠΈ Id-Ρ…Π΅Π½Π΄Π»Π΅Ρ€Π° ΠΈΠ»ΠΈ nil
sum - Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 0)
mws - Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Middleware для оборачивания ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hanlde()

func (*IdHandler) Enabled

func (h *IdHandler) Enabled(ctx context.Context, level slog.Level) bool

ΠœΠ΅Ρ‚ΠΎΠ΄ Enabled() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

func (*IdHandler) Handle

func (h *IdHandler) Handle(ctx context.Context, r slog.Record) error

ΠœΠ΅Ρ‚ΠΎΠ΄ Handle() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

func (*IdHandler) WithAttrs

func (h *IdHandler) WithAttrs(attrs []slog.Attr) slog.Handler

ΠœΠ΅Ρ‚ΠΎΠ΄ WithAttrs() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

func (*IdHandler) WithGroup

func (h *IdHandler) WithGroup(name string) slog.Handler

ΠœΠ΅Ρ‚ΠΎΠ΄ WithGroup() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для IdHandler'Π°

type IdOptions struct {
    // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π» ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ("goroutine")
    GoId bool `json:"goId"`

    // Π”ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ UUID ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ("logId")
    LogId bool `json:"logId"`

    // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ подсчёт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы (КБ)
    AddSum bool `json:"addSum"`

    // Π’Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму ΠΏΠΎ всСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ рСкурсивно
    SumFull bool `json:"sumFull"`

    // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² расчСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
    SumTime bool `json:"sumTime"`

    // ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ записи
    SumChain bool `json:"sumChain"`

    // НС ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ КБ Π² послСдний Π±Π°ΠΉΡ‚ UUID, Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ "LogSum"
    SumAlone bool `json:"sumAlone"`
}

type Logger

Logger описываСт ΠΏΠΎΠ»Π½ΡƒΡŽ структуру управлСния Π»ΠΎΠ³Π³Π΅Ρ€ΠΎΠΌ.

type Logger struct {
    // Logger - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° стандартный slog-Π»ΠΎΠ³Π³Π΅Ρ€.
    // Допустимо (ΠΈ рСкомСндуСтся) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сигнатуры стандартного
    // ΠΏΠ°ΠΊΠ΅Ρ‚Π° "log/slog" ΠΏΡ€ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса логгирования Π² прилоТСниях,
    // ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ являСтся основной Ρ†Π΅Π»ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Ρ„Π°Π±Ρ€ΠΈΠΊ)
    // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… структуру Logger.
    *slog.Logger

    // Level - структура для бСзопасного управлСния ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования.
    // Для измСнСния уровня логирования Π² процСссС
    // выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Ρ‘ ΠΌΠ΅Ρ‚ΠΎΠ΄ Set().
    // ΠœΠ΅Ρ‚ΠΎΠ΄ Level() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования.
    Level *slog.LevelVar

    // Writer - это ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ интСрфСйс писатСля Π»ΠΎΠ³ΠΎΠ².
    // Π”Π°Π½Π½Ρ‹ΠΉ интСрфСйс ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Rotate() ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚
    // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³ΠΎΠ² Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ,
    // Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ сигналу SIGHUP.
    // ΠœΠ΅Ρ‚ΠΎΠ΄ IsRotatable() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ возмоТности Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π°.
    // Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ содСрТит Ρ‚Π°ΠΊ ΠΆΠ΅ стандартный ΠΌΠ΅Ρ‚ΠΎΠ΄ Write(),
    // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для прямой записи Π² ΠΊΠ°Π½Π°Π» ΠΈ/ΠΈΠ»ΠΈ
    // Π² Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π°.
    // ΠŸΠ°ΠΊΠ΅Ρ‚ xlog ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для Π΄Π°Π½Π½Ρ‹Ρ… интСрфСйсов NewWriter().
    Writer
}

func Current

func Current() *Logger

Current Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ) Π»ΠΎΠ³Π³Π΅Ρ€

func Default

func Default() *Logger

Default() создаСт Π»ΠΎΠ³Π³Π΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° основС ΠΏΠ΅Ρ€Π²ΠΎΡ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ slog Π»ΠΎΠ³Π³Π΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ†ΠΈΠΉ, с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π½Π° stdout), Π½ΠΎ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ управлСния ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования.

func FromSlog(logger *slog.Logger) *Logger

FromSlog создаСт X-logger ΠΈΠ· *slog.Logger. Π£ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ "суррогатного" Π»ΠΎΠ³Π³Π΅Ρ€Π° Π½Π΅Ρ‚ возмоТности ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ "сахарныС" ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‚ΠΈΠΏΠ° Trace() ΠΈΠ»ΠΈ Noticef().

func New

func New(conf Conf, mws ...Middleware) *Logger

New - создаёт Π½ΠΎΠ²Ρ‹ΠΉ X-logger Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» (stdout/stderr) ΠΈ/ΠΈΠ»ΠΈ с записью ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ (ΠΏΡ€ΠΈ нСобходимости), с Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (JSON/Text). Ѐункция являСтся простой надстройкой Π½Π°Π΄ NewWriter() ΠΈ NewEx().

conf - обобщСнная конфигурация Π»ΠΎΠ³Π³Π΅Ρ€Π°
mws - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ (middleware) для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hanlde() интСрфСйса slog.Handler

func NewEx

func NewEx(conf Conf, writer Writer, mws ...Middleware) *Logger

NewEx - создаёт Π½ΠΎΠ²Ρ‹ΠΉ X-logger Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Writer. Поля Pipe ΠΈ File структуры conf ΠΏΡ€ΠΈ это ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, направлСния Π²Ρ‹Π²ΠΎΠ΄Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ writer. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Π°Ρ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Middleware.

conf - обобщСнная конфигурация Π»ΠΎΠ³Π³Π΅Ρ€Π°
writer - Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Π»ΠΎΠ³ΠΎΠ² (Π² Ρ‚.Ρ‡. Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ)
mws - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ (middleware) для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hanlde() интСрфСйса slog.Handler

func NewWithWriter(conf Conf, writer io.Writer, mws ...Middleware) *Logger

NewWithWriter - создаёт Π½ΠΎΠ²Ρ‹ΠΉ X-logger Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» (stdout/stderr) ΠΈ/ΠΈΠ»ΠΈ с записью ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ (ΠΏΡ€ΠΈ нСобходимости), с Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»Π° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (JSON/Text), Π° Ссли ΡƒΠΊΠ°Π·Π°Π½ writer, Ρ‚ΠΎ с ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ io.Writer. Ѐункция являСтся простой надстройкой Π½Π°Π΄ NewWriter() ΠΈ NewEx().

conf - обобщСнная конфигурация Π»ΠΎΠ³Π³Π΅Ρ€Π°
writer - Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Π»ΠΎΠ³ΠΎΠ²
mws - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ (middleware) для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Hanlde() интСрфСйса slog.Handler

func With

func With(args ...any) *Logger

With создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π° основС глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func WithAttrs(attrs []slog.Attr) *Logger

WithAttrs создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ c Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π° основС глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func WithFields(fields FieldsProvider) *Logger

WithFields создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Π½Π° основС глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°.

func WithGroup(name string) *Logger

WithGroup создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π° основС глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func WithMiddleware(mws ...Middleware) *Logger

WithMiddleware создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ c Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Middleware Π½Π° основС глобального Π»ΠΎΠ³Π³Π΅Ρ€Π°

func (*Logger) Alert

func (c *Logger) Alert(msg string, args ...any)

Alert записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelAlert)

func (*Logger) Alertf

func (c *Logger) Alertf(format string, args ...any)

Alertf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelAlert)

func (*Logger) Crit

func (c *Logger) Crit(msg string, args ...any)

Crit записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelCrit)

func (*Logger) Critf

func (c *Logger) Critf(format string, args ...any)

Critf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelCrit)

func (*Logger) Debug

func (c *Logger) Debug(msg string, args ...any)

Debug записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelDebug)

func (*Logger) Debugf

func (c *Logger) Debugf(format string, args ...any)

Debugf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelDebug)

func (*Logger) Emerg

func (c *Logger) Emerg(msg string, args ...any)

Emerg записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelEmerg)

func (*Logger) Emergf

func (c *Logger) Emergf(format string, args ...any)

Emergf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelEmerg)

func (*Logger) Error

func (c *Logger) Error(msg string, args ...any)

Error записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelError)

func (*Logger) Errorf

func (c *Logger) Errorf(format string, args ...any)

Errorf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelError)

func (*Logger) Fatal

func (c *Logger) Fatal(msg string, args ...any)

Fatal записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelFatal) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° os.Exit(1)

func (*Logger) Fatalf

func (c *Logger) Fatalf(format string, args ...any)

Fatalf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelFatal) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° os.Exit(1)

func (*Logger) Flood

func (c *Logger) Flood(msg string, args ...any)

Flood записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelFlood)

func (*Logger) Floodf

func (c *Logger) Floodf(format string, args ...any)

Floodf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelFlood)

func (*Logger) GetLevel

func (c *Logger) GetLevel() slog.Level

GetLevel Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° для Π²Ρ‹Π·ΠΎΠ²Π° c.Leveler.Level()

func (*Logger) GetLvl

func (c *Logger) GetLvl() string

GetLvl Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования Π² Π²ΠΈΠ΄Π΅ строки Π²ΠΈΠ΄Π° "info", "debug" ΠΈ Ρ‚.ΠΏ.

func (*Logger) Info

func (c *Logger) Info(msg string, args ...any)

Info записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelInfo)

func (*Logger) Infof

func (c *Logger) Infof(format string, args ...any)

Infof записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelInfo)

func (*Logger) IsRotatable

func (c *Logger) IsRotatable() bool

IsRotatable Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ возмоТности Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π°

func (*Logger) Log

func (c *Logger) Log(ctx context.Context, level slog.Level, msg string, args ...any) error

Log записываСт сообщСниС Π² структурированный ΠΆΡƒΡ€Π½Π°Π» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ контСкстом

func (*Logger) LogAttrs

func (c *Logger) LogAttrs(ctx context.Context, level slog.Level, msg string, attrs ...slog.Attr) error

LogAttr записываСт сообщСниС с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Π² структурированный ΠΆΡƒΡ€Π½Π°Π» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ контСкстом

func (*Logger) Logf

func (c *Logger) Logf(level slog.Level, format string, args ...any)

Log записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования

func (*Logger) Notice

func (c *Logger) Notice(msg string, args ...any)

Notice записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelNotice)

func (*Logger) Noticef

func (c *Logger) Noticef(format string, args ...any)

Noticef записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelNotice)

func (*Logger) Panic

func (c *Logger) Panic(msg string)

Fatal записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelPanic) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° panic()

func (*Logger) Rotate

func (c *Logger) Rotate() error

Rotate ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° (Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ) - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° для Π²Ρ‹Π·ΠΎΠ²Π° c.Writer.Rotable()/c.Writer.Rotate(). К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… прилоТСниях Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ротация Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎ сигналу SIGHUP.

func (*Logger) SetDefault

func (c *Logger) SetDefault()

SetDefault устанавливаСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ

func (*Logger) SetDefaultLogs

func (c *Logger) SetDefaultLogs()

SetDefaultLogs устанавливаСт Π΄Π°Π½Π½Ρ‹ΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ, Π² Ρ‚ΠΎΠΌ числС log/slog Π»ΠΎΠ³Π³Π΅Ρ€ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

func (*Logger) SetLevel

func (c *Logger) SetLevel(level slog.Level)

SetLevel обновляСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования - ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° для Π²Ρ‹Π·ΠΎΠ²Π° c.Leveler.Update()

func (*Logger) SetLvl

func (c *Logger) SetLvl(level string)

SetLvl обновляСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования Π½Π° основС строки ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ‚ΠΈΠΏΠ° "trace", "error" ΠΈ Ρ‚.ΠΏ.

func (*Logger) Slog

func (c *Logger) Slog() *slog.Logger

Slog Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ *slog.Logger

func (*Logger) Trace

func (c *Logger) Trace(msg string, args ...any)

Trace записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelTrace)

func (*Logger) Tracef

func (c *Logger) Tracef(format string, args ...any)

Tracef записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelTrace)

func (*Logger) Warn

func (c *Logger) Warn(msg string, args ...any)

Warn записываСт сообщСниС Π² ΠΆΡƒΡ€Π½Π°Π» (LevelWarn)

func (*Logger) Warnf

func (c *Logger) Warnf(format string, args ...any)

Warnf записываСт сообщСниС Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (LevelWarn)

func (*Logger) With

func (c *Logger) With(args ...any) *Logger

With создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠœΠ΅Ρ‚ΠΎΠ΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ With для *slog.Logger.

func (*Logger) WithAttrs

func (c *Logger) WithAttrs(attrs []slog.Attr) *Logger

WithAttrs создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ c Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

func (*Logger) WithFields

func (c *Logger) WithFields(fields ...FieldsProvider) *Logger

With создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

func (*Logger) WithGroup

func (c *Logger) WithGroup(name string) *Logger

WithGroup создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹. ΠœΠ΅Ρ‚ΠΎΠ΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ WithGroup для *slog.Logger.

func (*Logger) WithMiddleware

func (c *Logger) WithMiddleware(mws ...Middleware) *Logger

WithMiddleware создаСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ c Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Middleware

Middleware - описываСт Ρ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для построСния ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΎΠΊ для slog.Handler'Π² (Ρ‚.Π½. middleware)

type Middleware func(next HandleFunc) HandleFunc

func NewMiddleware(mwf MiddlewareFunc) Middleware

NewMiddleware создаСт Π½ΠΎΠ²Ρ‹ΠΉ Middleware Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ с использованиСм Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ

mwf - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Ρ‚ΠΈΠΏΠ° MiddlewareFunc

func NewMiddlewareForError(logErr *Logger) Middleware

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Middleware, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всС сообщСния с ошибками (с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ "err") Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ направляСт Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π»ΠΎΠ³Π³Π΅Ρ€. Данная функция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° скорСС для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования Middleware, Ρ‡Π΅ΠΌ для практичСского примСнСния.

func NewMiddlewareMulti(log *Logger) Middleware

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Middleware, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ записСй Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ (имитация Ρ€Π΅ΠΆΠΈΠΌΠ° "Multi Handler")

log - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³Π³Π΅Ρ€ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ сообщСния

func NewMiddlewareNoPasswd() Middleware

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ middleware, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ замСняСт значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² passwd, password Π½Π° ********. Данная функция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° скорСС для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования Middleware, Ρ‡Π΅ΠΌ для практичСского примСнСния.

func NewMiddlewareRateLimit(conf RateLimitConf) Middleware

NewMiddlewareRateLimit Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Middleware для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ограничитСля большого числа ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ сообщСний Ρ‚.Π½. RateLimiter'Π°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ² сообщСний производится ΠΏΠΎ ΡƒΡ€ΠΎΠ²Π½ΡŽ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (level) ΠΈ тСксту сообщСния (msg).

conf - конфигурация RateLimeter'Π°

func NewMiddlewareWithFields(fields FieldsProvider) Middleware

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Middleware, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт (Π² Π½Π°Ρ‡Π°Π»ΠΎ) записи Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ - всС поля Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² послСднюю ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ. Данная функция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° скорСС для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° использования Middleware, Ρ‡Π΅ΠΌ для практичСского примСнСния.

MiddlewareFunc - описываСт ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ для построСния Middleware

Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ctx ΠΈ r, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Middleware ΠΈΠ»ΠΈ Handle.

type MiddlewareFunc func(
    ctx context.Context, r slog.Record,
    next HandleFunc) error

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° для создания Handler'ΠΎΠ² с Middleware

type MiddlewareHandler struct {
    // contains filtered or unexported fields
}

func NewMiddlewareHandler(handler slog.Handler, mws ...Middleware) *MiddlewareHandler

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ MiddlewareHandler'Π° с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ middleware(s)

func (*MiddlewareHandler) Enabled

func (h *MiddlewareHandler) Enabled(ctx context.Context, level slog.Level) bool

Enabled() трСбуСтся для интСрфСйса slog.Handler

func (*MiddlewareHandler) Handle

func (h *MiddlewareHandler) Handle(ctx context.Context, r slog.Record) error

Handle() трСбуСтся для интСрфСйса slog.Handler

func (*MiddlewareHandler) WithAttrs

func (h *MiddlewareHandler) WithAttrs(attrs []slog.Attr) slog.Handler

WithAttrs() трСбуСтся для интСрфСйса slog.Handler

func (*MiddlewareHandler) WithGroup

func (h *MiddlewareHandler) WithGroup(name string) slog.Handler

WithGroup() трСбуСтся для интСрфСйса slog.Handler

MultiWriter - это ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° для io.Writer для направлСния ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΏΠΎ нСскольким направлСниям. ΠœΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ ΠΏΠΎ нСскольким направлСниям ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ syslog + NATS).

type MultiWriter []io.Writer

func NewMultiWriter() MultiWriter

NewMultiWriter cΠΎΠ·Π΄Π°Π΅Ρ‚ "пустой" MutliWriter. Π”Π°Π»Π΅Π΅ Π² MultiWriter ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ io.Writer'Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Add.

func (MultiWriter) Add

func (mw MultiWriter) Add(w io.Writer)

Add добавляСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ io.Writer Π² MultiWriter

func (MultiWriter) Write

func (mw MultiWriter) Write(data []byte) (int, error)

Write Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс io.Writer для MultiWriter'Π°. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ запись Π΄Π°Π½Π½Ρ‹Ρ… data Π²ΠΎ всС io.Writer'Ρ‹ MultiWriter'Π°. Ошибки Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ.

type Opt

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° управлСния ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° основС ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π’ΠΈΠΏΠΎΠ²ΠΎΠ΅ использованиС:

opt := xlog.NewOpt()  // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ (*xlog.Opt)
conf := xlog.Conf{}   // ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π°
xlog.Env(&conf)       // ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ conf ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния
flag.Parse()          // ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ opt ΠΈΠ· ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки
opt.UpdateConf(&conf) // ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒ conf опциями ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

log := xlog.New(conf) // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠ³Π³Π΅Ρ€ (*xlog.Logger)
logger := log.Logger  // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° *slog.Logger

log.Notice("ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π›ΠΎΠ³Π³Π΅Ρ€", "version", "1.0.0")
mylog := logger.With("app", "helloworld")
mylog.Info("application started")
type Opt struct {
    Level                  string // -log-level
    Pipe                   string // -log-pipe
    File                   string // -log-file
    FileMode               string // -log-file-mode
    Format                 string // -log-format
    GoId                   string // -log-goid
    Id                     string // -log-id
    Sum                    string // -log-sum
    SumFull                string // -log-sum-full
    SumChain               string // -log-sum-chain
    SumAlone               string // -log-sum-alone
    Time                   string // -log-time
    TimeLocal              string // -log-time-local
    TimeMicro              string // -log-time-micro
    TimeFormat             string // -log-time-format
    Src                    string // -log-src
    SrcPkg                 string // -log-src-pkg
    SrcFunc                string // -log-src-func
    SrcExt                 string // -log-src-ext
    Color                  string // -log-color
    LevelOff               string // -log-level-off
    RateLimit              string // -log-rate-limit
    RateLimitMaxNum        string // -log-rate-limit-max-num
    RateLimitIntervalMs    string // -log-rate-limit-interval-ms
    RateLimitFlushPeriodMs string // -log-rate-limit-flush-period-ms
    Rotate                 string // -log-rotate
    RotateMaxSize          string // -log-rotate-max-size
    RotateMaxAge           string // -log-rotate-max-age
    RotateMaxBackups       string // -log-rotate-max-backups
    RotateLocalTime        string // -log-rotate-local-time
    RotateCompress         string // -log-rotate-compress
}

func NewOpt

func NewOpt(prefixOpt ...string) *Opt

NewOpt создаёт Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π°. ПослС создания ΠΎΠΏΡ†ΠΈΠΉ Opt ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартный Π²Ρ‹Π·ΠΎΠ² flag.Parse() для заполнСния ΠΏΠΎΠ»Π΅ΠΉ структуры. Π‘ΡƒΠ»Π΅Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния.

prefixOpt - ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ прСфикс (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ "log-")

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² свой usage-Π²Ρ‹Π²ΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст:

-log-level <level>                   - log level (flood/trace/debug/info/notice/warm/error/crit)
-log-pipe <pipe>                     - log pipe (stdout/stderr/null)
-log-file <file>                     - log file path
-log-file-mode <perm>                - log file mode (0640, 0600, 0644)
-log-format <format>                 - log format (json|prod/text|logfmt/tint|tinted|human/default|std)
-log-goid <on/off>                   - force on/off goroutine id for each record (goroutine)
-log-id <on/off>                     - force on/off id (UUID) for each record (logId)
-log-sum <on/off>                    - force on/off check sum for each record
-log-sum-full <on/off>               - force on/off calculate full sum for earch record
-log-sum-chain <on/off>              - force on/off check sum chain
-log-sum-alone <on/off>              - force on/off add check sum as alone atribute (logSum)
-log-time <on/off>                   - force on/off timestamp
-log-time-local <on/off>             - use local time (UTC by default)
-log-time-micro <on/off>             - force on/off microseconds in timestamp
-log-time-format <fmt>               - override tinted log time format (e.g. 15:04:05.999 or timeOnly)
-log-src <on/off>                    - force on/off log source file name and line number
-log-src-pkg <on/off>                - force on/off log source directory/file name and line number
-log-src-func <on/off>               - force on/off log function name
-log-src-ext <on/off>                - force enable/disable show ".go" extension of source file name
-log-color <on/off>                  - force enable/disable tinted colors (ANSI/Escape)
-log-level-off <true/false>          - force disable/enable level output
-log-rate-limit <on/off>             - force enable/disable rate limiter
-log-rate-limit-max-num <int>        - maximal number of rate limit messages
-log-rate-limit-interval-ms <ms>     - rate limiter interval [ms]
-log-rate-limit-flush-period-ms <ms> - rate limiter flush period [ms]
-log-rotate <on/off>                 - force on/off log rotate
-log-rotate-max-size <mb>            - rotate max size (begabytes)
-log-rotate-max-age <days>           - rotate max age (days)
-log-rotate-max-backups <num>        - rotate max backup files
-log-rotate-local-time <yes/no>      - use localtime (default UTC)
-log-rotate-compress <on/off>        - on/off compress (gzip)

func (*Opt) UpdateConf

func (opt *Opt) UpdateConf(conf *Conf)

UpdateConf ΠΎΠ±ΠΎΠ³Π°Ρ‰Π°Π΅Ρ‚ структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³Π³Π΅Ρ€Π° опциями ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Если ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π½Π΅ Π·Π°Π΄Π°Π½Ρ‹, Ρ‚ΠΎ поля структуры ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ conf Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Настройка ограничитСля Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΆΡƒΡ€Π½Π°Π» большого числа сходных сообщСний Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚.Π½. Rate Limiter.

Для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² MaxNum ΠΈ IntervalMs ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ограничитСля ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ значСния 100 ΠΈ 1000 соотвСтствСнно, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… сообщСний Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ 100 ΡˆΡ‚/сСк.

ΠžΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹ΠΌΠΈ сообщСниями ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ сообщСния с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ логирования (level) ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ сообщСниСм (msg).

ΠŸΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π»ΠΈΠΌΠΈΡ‚Π° ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ сообщСниС "Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ" ΠΏΡƒΡ‚Π΅ΠΌ объСдинСния всСх Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±Ρ‰ΠΈΠΉ key/value список (послСдниС значСния ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΠ΅) ΠΈ добавляСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ `repeated` Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сколько сообщСний Π±Ρ‹Π»ΠΎ объСдСно Π² ΠΎΠ΄Π½ΠΎ. Π’ качСствС ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сообщСния пСрСдаСтся врСмя послСднСго сообщСния.

Π”Π°Π½Π½Ρ‹ΠΉ Rate Limiter Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ сообщСния с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ строками сообщСний. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΡ€ΠΈ использовании сахарных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚ΠΈΠΏΠ° Infof/Errorf Π»ΠΎΠ³Π³Π΅Ρ€Π°, Ссли Ρƒ сообщСний Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ основная строка, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ сообщСния Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹ΠΌΠΈ. Π’ Ρ†Π΅Π»ΠΎΠΌ этот эффСкт ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ ограничитСля для особо Π²Π°ΠΆΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ событий (Π² этом случаС Π² тСкст сообщСния Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΡƒΡŽΡΡ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ).

type RateLimitConf struct {
    // Π”Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Rate Limiter (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½)
    Disable bool `json:"disable"`

    // МаксимальноС число сообщСниС с ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹ΠΌ level/msg допустимоС
    // Π·Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ врСмя.
    // НулСвоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ соотвСтствуСт 100 ΡˆΡ‚ сообщСний.
    // Π§Π΅ΠΌ большСС число Π·Π°Π΄Π°Π½ΠΎ, Ρ‚Π΅ΠΌ большС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти потрСбуСтся
    // для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ограничитСля ΠΏΡ€ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ΅ сообщСний.
    MaxNum int `json:"maxNum"`

    // Π’Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» (Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°) Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ
    // ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ сообщСниС Π΄ΠΎ MaxNum ΡˆΡ‚ΡƒΠΊ Π½Π΅ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ,
    // задаСтся Π² миллисСкундах.
    // НулСвоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ принимаСтся Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π² 1000 мс.
    IntervalMs int `json:"intervalMs"`

    // ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ выброса Π² ΠΆΡƒΡ€Π½Π°Π» сгруппированных сообщСний,
    // Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сгруппированныС сообщСния своСврСмСнно
    // ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΈ Π² ΠΆΡƒΡ€Π½Π°Π» Π² условиях, ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… сообщСний Π½Π΅Ρ‚,
    // задаСтся Π² миллисСкундах.
    //
    // НулСвоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ принимаСтся Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π² 5000 мс.
    //
    // ΠŸΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ создаСтся
    // ΠΈ сгруппированныС сообщСния ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΆΡƒΡ€Π½Π°Π» Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ формирования
    // Π½ΠΎΠ²Ρ‹Ρ… записСй (сгруппированныС Π²Ρ‹Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄).
    FlushPeriodMs int `json:"flushPeriodMs"`
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² (унаслСдовано ΠΎΡ‚ lumberjack). Π‘ΠΌ. https://github.com/natefinch/lumberjack Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° встроСна Π² структуру ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Conf.

type RotateConf struct {
    // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π»ΠΎΠ³ΠΎΠ².
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π·Π°Π΄Π°Π½ false) Ρ€ΠΎΡ‚Π°Ρ†ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π°.
    Enable bool `json:"enable"`

    // ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°Ρ… Π΄ΠΎ Π΅Π³ΠΎ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ.
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π·Π°Π΄Π°Π½ 0) - 10 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚.
    MaxSize int `json:"max-size"`

    // МаксимальноС количСство Π΄Π½Π΅ΠΉ для хранСния старых Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»Π° зависит ΠΎΡ‚
    // Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² ΠΈΡ… ΠΈΠΌΠ΅Π½ΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ дСнь
    // опрСдСляСтся ΠΊΠ°ΠΊ 24 часы ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ совсСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€Π½Ρ‹ΠΌ
    // дням ΠΈΠ·-Π·Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π»Π΅Ρ‚Π½Π΅Π΅ врСмя, високосных сСкунд ΠΈ Ρ‚.Π΄.
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π·Π°Π΄Π°Π½ΠΎ 0), Ρ‚ΠΎ  старыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² послС Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ
    // Π½Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Π² зависимости ΠΎΡ‚ возраста.
    //
    // На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ рСкомСндуСтся Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 10 Π΄Π½Π΅ΠΉ.
    MaxAge int `json:"max-age"`

    // МаксимальноС количСство сохраняСмых старых Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ².
    // По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π·Π°Π΄Π°Π½ΠΎ 0), Ρ‚ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ всС старыС Ρ„Π°ΠΉΠ»Ρ‹
    // ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² (хотя MaxAge всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΈΡ… ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ).
    //
    // На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ рСкомСндуСтся Π·Π°Π΄Π°Ρ‡ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² 100.
    MaxBackups int `json:"max-backups"`

    // ΠœΠ΅ΡΡ‚Π½ΠΎΠ΅ врСмя опрСдСляСт, являСтся Π»ΠΈ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для
    // форматирования Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ Π² Ρ„Π°ΠΉΠ»Π°Ρ… Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΠΉ, мСстным
    // Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π·Π°Π΄Π°Π½ΠΎ false), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ
    // врСмя UTC.
    LocalTime bool `json:"local-time"`

    // Compress опрСдСляСт, слСдуСт Π»ΠΈ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ Ρ€ΠΎΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π°
    // с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gzip. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ссли Π·Π°Π΄Π°Π½ΠΎ false) сТатиС Π½Π΅ выполняСтся.
    Compress bool `json:"compress"`
}

Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π΄Π°Π½Π½ΠΎΠΌΡƒ интСрфСйсу выводятся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° String() Π±Π΅Π· рСфлСксии с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Sprint() ΠΏΡ€ΠΈ использовании TintHandler

type Stringer interface {
    String() string
}

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… TintHandler, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ интСрфСйсу slog.Handler. TintHandler - это минималистский slog.Handler с подсвСткой Π½Π° основС исходников с "github.com/lmittmann/tint" (https://github.com/lmittmann/tint/blob/main/handler.go\).

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ исходного ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

  • MIT License
  • отсутствиС зависимостСй (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ slog)
  • ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ схоТ с zerolog.ConsoleWriter ΠΈ slog.TextHandler
  • "Ρ‚ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅" ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²
  • подсвСтка ошибок
  • всю подсвСтку Π½Π° основС ANSII символов ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ
  • ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° `ReplaceAtt` ΠΊΠ°ΠΊ Ρƒ slog.TextHandler/slog.JSONHandler

Π§Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

  • ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π° подкраска ошибок
  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°/Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΏΠΎ опциям: sourcePkg/source/Func)
  • Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ уровня (noLevel)
  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»Π° ".go"
  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² UTC
  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур, Π² Ρ‚.Ρ‡. ΠΏΠΎ указатСлям (см. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Sprint())
  • нСсколько ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΎ прСдставлСниС чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ (ΠΊΠ°ΠΊ Π² JSON)
  • врСмя Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… выводится Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ time.RFC3339Nano (Π° Π½Π΅ просто ΠΊΠ°ΠΊ t.String())
type TintHandler struct {
    // contains filtered or unexported fields
}

func NewTintHandler(w io.Writer, opts *TintOptions) *TintHandler

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Tinted Ρ…Π΅Π½Π΄Π»Π΅Ρ€, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ slog.Handler'Ρƒ

func (*TintHandler) Enabled

func (h *TintHandler) Enabled(_ context.Context, level slog.Level) bool

ΠœΠ΅Ρ‚ΠΎΠ΄ Enabled() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

func (*TintHandler) Handle

func (h *TintHandler) Handle(ctx context.Context, r slog.Record) error

ΠœΠ΅Ρ‚ΠΎΠ΄ Handle() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

func (*TintHandler) WithAttrs

func (h *TintHandler) WithAttrs(attrs []slog.Attr) slog.Handler

ΠœΠ΅Ρ‚ΠΎΠ΄ WithAttrs() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

func (*TintHandler) WithGroup

func (h *TintHandler) WithGroup(name string) slog.Handler

ΠœΠ΅Ρ‚ΠΎΠ΄ WithGroup() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс slog.Handler

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для создания TintHandler'Π°

type TintOptions struct {
    // Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Турналирования
    // (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ DefaultLevel=slog.LevelInfo).
    // БообщСния Π½ΠΈΠΆΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ уровня Π½Π΅ выводятся Π² ΠΆΡƒΡ€Π½Π°Π».
    Level slog.Leveler

    // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ссылки Π½Π° исходный ΠΊΠΎΠ΄ (Ρ„Π°ΠΉΠ»:строка)
    AddSource bool

    // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ имя ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΊ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° исходного тСкста (ΠΏΠ°ΠΊΠ΅Ρ‚/Ρ„Π°ΠΉΠ»:строка)
    SourcePkg bool

    // Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ/ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²
    SourceFunc bool

    // Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ".go" ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°
    NoExt bool

    // ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΊΠΈ уровня Турналирования
    NoLevel bool

    // ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ подсвСтку ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ANSI/Escape символов
    NoColor bool

    // Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² UTC
    TimeUTC bool

    // Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
    TimeFormat string

    // Ѐункция "Ρ…ΡƒΠΊ" для ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
    // записСй Π² ΠΆΡƒΡ€Π½Π°Π»Π΅.
    // Π‘ΠΌ. https://pkg.go.dev/log/slog#HandlerOptions for details.
    ReplaceAttr func(groups []string, attr slog.Attr) slog.Attr
}

type Writer

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ интСрфСйс писатСля Π»ΠΎΠ³ΠΎΠ² (с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ Π±Π΅Π·, с Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΆΡƒΡ€Π½Π°Π»Π° Π½Π° stdout/stderr ΠΈΠ»ΠΈ Π±Π΅Π·, с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ Π² кастомный io.Writer ΠΈΠ»ΠΈ Π±Π΅Π·).

type Writer interface {
    IsRotatable() bool // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ
    Rotate() error     // Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΆΡƒΡ€Π½Π°Π»Π° (Ссли ΠΎΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°)
    Close() error      // Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π°
    io.Writer          // интСрфСйс со стандартным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Wite([]byte) (int, error)
}

func NewWriter(pipeName, fileName, mode string, rotate *RotateConf, writer io.Writer) Writer

NewWriter создаёт ΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Π»ΠΎΠ³ΠΎΠ² с интСрфСйсом Writer Π½Π° основС Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² логирования.

pipeName - имя ΠΊΠ°Π½Π°Π»Π° ("stdout", 'stderr", "nil" ΠΈΠ»ΠΈ пустая строка)
fileName - имя Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ»ΠΈ пустая строка
mode - Ρ€Π΅ΠΆΠΈΠΌ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ пустая строка (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ "0644" ΠΈΠ»ΠΈ "0660")
rotate - ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ»ΠΈ nil
writer - кастомный io.Writer ΠΈΠ»ΠΈ nil

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Writer осущСствляСт Π²Ρ‹Π²ΠΎΠ΄ Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎ нСскольким направлСниям Π² зависимости ΠΎΡ‚ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (ΠΎΡ‚ нуля Π΄ΠΎ Ρ‚Ρ€Π΅Ρ… Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ). Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ направлСния:

  1. Канал (pipe): stdout или stderr
  2. Π€Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° (file) с Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ Π±Π΅Π·
  3. ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ io.Writer

Данная Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 12 Ρ‚ΠΈΠΏΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ интСрфСйса Writer: ΠΎΡ‚ писатСля Π² "/dev/null" Π΄ΠΎ писатСля Π² Ρ‚Ρ€ΠΈ направлСния.

Generated by gomarkdoc

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages