logger

package
v0.0.0-...-2abc404 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 30, 2023 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// EnvLoggerJson -- отдавать строкой или в JSON?
	EnvLoggerJson = "LOG_JSON"
	DefLoggerJson = "json"
	DefLoggerText = "txt"

	// EnvLoggerFlags -- формат вывода сообщений "работать молча"
	EnvLoggerFlags = "LOG_FLAGS"
	DefLoggerFlags = -1

	// EnvLoggerLevel -- уровень вывода сообщений логгером:
	EnvLoggerLevel = "LOG_LEVEL"
	DefLoggerLevel = "info"

	// EnvTraceId -- идентификатор сквозной трассировки, если не типовой
	EnvTraceId = "LOG_TRACE_ID"
	DefTraceId = CtxTraceId
)
View Source
const (
	LogDefault   = 0
	LogShortFile = 1 << iota
	LogLongFile
	LogFuncName
	LogUTC
	LogDate
	LogTime
	LogMicroSeconds
	LogLevelColored
	LogWithTrace
	LogPrefix
)
View Source
const (
	LogNoneLevel  = 0
	LogPanicLevel = iota * 10
	LogFatalLevel
	LogErrorLevel
	LogWarnLevel
	LogInfoLevel
	LogDebugLevel

	LogPanicPrefix = "PANIC"
	LogFatalPrefix = "FATAL"
	LogErrorPrefix = "ERROR"
	LogWarnPrefix  = "WARN "
	LogInfoPrefix  = "INFO "
	LogDebugPrefix = "DEBUG"

	// LogFatalExitCode -- число, отдаваемое ОС при завершении программы из ...Fatal() вызовов.
	LogFatalExitCode = 500

	// CtxTraceId -- упрощенная версия идентификатора значений сквозного лога
	CtxTraceId = "trace_id"

	// BaseDefFlags местный стандарт формата вывода:
	BaseDefFlags = LogUTC | LogMicroSeconds | LogShortFile

	// BaselogJsonHandlerId порядковый номер доп. параметра конструкторам логгеров - внешний преобразователь в json
	// можно задать конструктору свой, если не задан применит BaseLogMarshal()
	BaselogJsonHandlerId = 0
	// CtxlogDefersId Номер в параметрах конструктору для предопределенного набора []func() -- завершателей контекстов
	CtxlogDefersId = 1
)
View Source
const (
	EscStart    = "\x1b["
	EscColorEnd = "m"

	EscReset       = "0"    // 	Reset / Normal 	выключение всех атрибутов
	EscBold        = "1"    // 	Жирный или увеличить яркость
	EscDark        = "2"    // 	Блёклый (уменьшить яркость) 	Не везде поддерживается
	EscCoursive    = "3"    // 	Курсив: вкл. 	Не везде поддерживается. Иногда обрабатывается как инверсия.
	EscUnderLine   = "4"    // 	Подчёркнутый: один раз
	EscBlinkSlow   = "5"    //	Мигание: Медленно 	менее 150 раз в минуту
	EscBlinkFast   = "6"    // 	Мигание: Часто 	MS-DOS ANSI.SYS; 150+ в минуту; не везде поддерживается
	EscInverse     = "7"    // 	Отображение: Негатив 	инвертирует или обращает; меняет цвета фона и текста
	EscHide        = "8"    // 	Скрытый 	Не везде поддерживается.
	EscDeprecate   = "9"    // 	Зачёркнутый 	Символы разборчивы, но помечены как удалённые. Не везде поддерживается.
	EscNormalFont  = "10"   // 	Основной (по умолчанию) шрифт
	EscFacture     = "20"   // 	Фрактура 	вряд ли поддерживается
	EscNoBold      = "21"   // 	Жирный: выкл. или Подчёркивание: Двойное 	жирный не всегда поддерживается; двойное подчёркивание вряд ли поддерживается.
	EscNormalLight = "22"   // 	Обычный цвет или яркость 	Ни жирный ни блеклый
	EscNoCursive   = "23"   // 	Не курсивный, не фрактура
	EscNoUnderLine = "24"   // 	Подчёркивание: Нет 	Подчёркивание ни одиночное ни двойное
	EscNoBlink     = "25"   // 	Мигание: выкл.
	EscNoIverse    = "27"   // 	Отображение: обычное 	не негатив
	EscNoHide      = "28"   // 	Отображающийся 	выключить скрытие
	EscNoDeprecate = "29"   // 	Не зачёркнутый
	Esc256Sym      = "38;5" //	Зарезервировано для дополнительных цветов 5;n где n {\displaystyle n} n индекс цвета (0..255)
	EscRGBSym      = "38;2" // или 2;r;g;b где r , g , b {\displaystyle r,g,b} {\displaystyle r,g,b} — красный, зелёный и синий каналы цвета (в пределах 255)
	EscDefSym      = "39"   // 	Цвет текста по умолчанию (на переднем плане) 	зависит от реализации (в соответствии со стандартом)
	Esc256Back     = "48;5" // 	Зарезервировано для установки расширенного цвета фона 5;n где n {\displaystyle n} n индекс цвета (0..255)
	EscRGBBack     = "48;2" // или 2;r;g;b где r , g , b {\displaystyle r,g,b} {\displaystyle r,g,b} — красный, зелёный и синий каналы цвета (в пределах 255)
	EscDefBack     = "49"   // 	Цвет фона по умолчанию 	зависит от реализации (в соответствии со стандартом)
	EscBorder1     = "51"   // 	Обрамлённый
	EscBorder2     = "52"   // 	Окружённый
	EscUpperLine   = "53"   // 	Надчёркнутый
	EscNoBorder    = "54"   // 	Не обрамлённый и не окружённый
	EscNoUpperLine = "55"   // 	Не надчёркнутый

	EscBlackCurrent     = "\x1b[10;30m" // черным по текущему (черный == hide!)
	EscRedCurrent       = "\x1b[10;31m" // темнокрасный ..
	EscGreenCurrent     = "\x1b[10;32m" // темнозеленый по текущему
	EscYellowCurrent    = "\x1b[10;33m" // коричневый(?) по текущему
	EscBlueCurrent      = "\x1b[10;34m" // синим по текущему
	EscMagentaCurrent   = "\x1b[10;35m" // фиолетовым по текущему
	EscCyanCurrent      = "\x1b[10;36m" // сианом по текущему
	EscLightGrayCurrent = "\x1b[10;37m" // светосерым по текущему
	EscWhiteCurrent     = "\x1b[1;37m"  // белым(ярким, жирным) по текущему
)

Variables

View Source
var GlDefColors = map[string]string{
	LogPanicPrefix: EscStart + EscBlinkFast + EscColorEnd + EscStart + EscBold + ";" + EscRedCurrent + EscColorEnd,
	LogFatalPrefix: EscStart + EscBlinkSlow + EscColorEnd + EscStart + EscBold + ";" + EscRedCurrent + EscColorEnd,
	LogErrorPrefix: EscStart + EscBold + ";" + EscRedCurrent + EscColorEnd,
	LogWarnPrefix:  EscStart + EscNormalFont + ";" + EscMagentaCurrent + EscColorEnd,
	LogInfoPrefix:  EscStart + EscNormalFont + ";" + EscGreenCurrent + EscColorEnd,
	LogDebugPrefix: EscStart + EscCoursive + ";" + EscBlueCurrent + EscColorEnd,
}

GlDefColors -- дефолтная таблица цветов для вывода сообщения

Functions

func BaseLogMarshal

func BaseLogMarshal(buf *[]byte, depth int, now time.Time, level, message string) error

BaseLogMarshal -- местный маршаллер в JSON лога с типовыми параметрами

func FormatColored

func FormatColored(buf *[]byte, color, message string)

FormatColored -- раскраска строки заданным цветом с последующей отменой

func FormatFileLine

func FormatFileLine(buf *[]byte, depth int, isShort bool)

FormatFileLine -- добавляет в буфер информацию о файле и номере строки

func FormatFuncLine

func FormatFuncLine(buf *[]byte, depth int)

FormatFuncLine -- добавляет в буфер название функции(метода) и номер строки файла

func FormatSlice

func FormatSlice(buf *[]byte, messages []string)

FormatSlice -- добавление в строку лога заданного списка текстовок

func FormatTime

func FormatTime(buf *[]byte, now time.Time, flags int)

FormatTime -- добавляет в заданный буфер время в текущем формате лога

func FormatTrace

func FormatTrace(buf *[]byte, ctx context.Context, traceId any)

FormatTrace -- достает из контекста значение по заданному иденту и добавляет его в лог

func GetCaller

func GetCaller(skip int) (runtime.Frame, bool)

GetCaller -- отдает собственно контекст, вызвавший логирование

func GetCallers

func GetCallers(skip int) *runtime.Frames

GetCallers -- отдает стек вызвавших логирование контекстов

func LookupEnv

func LookupEnv(name string, defVal interface{}) interface{}

LookupEnv @return -- значение переменной окружения или дефолтное (пофиг: нет или с ошибкой)

func MapLogMarshal

func MapLogMarshal(buf *[]byte, depth int, now time.Time, level, message string, args ...any) ([]byte, error)

MapLogMarshal -- местный маршаллер в JSON лога с типовыми параметрами

func ToInt

func ToInt(val interface{}) int

ToInt -- Преобразование результата к целому @see config.go

func ToString

func ToString(val interface{}) string

ToString -- Преобразование результата к строке @see config.go

Types

type BaseLogger

type BaseLogger struct {
	Mu sync.Mutex
	// куда выводить сообщения (nil - в никуда)
	Out io.Writer
	// Level -- наибольший разрешенный уровень вывода сообщений
	Level int
	// Flags -- Что выводить в лог
	Flags int
	// ToJson -- маршаллер сообщений в json, если задан. Иначе - строка
	ToJson LogJsonHandler
}

BaseLogger -- местная реализация базового интерфейса. По мотивам пакета log с упрощениями и добавлением типовых потребностей для полноценного логирования: 1. Управление уровнем вывода и возможность вывода "в никуда". 2. Внутренний вызов fmt.Sprintf() для вставки в лог параметров на лету 3. Возможность вывода в формате json 4. Реентерабельность и возможность применения одного логера в нескольких горутинах. Внутри структуры ничего лишнего нет. 5. Закрытие файла вывода при логировании Fatal() и Panic() блокировка мьютексом только непосредственно вывода сообщения в поток(файл) Все поля структуры публичны, для полноценного внедрения по мере потребности программиста в развитии пакета.

func (*BaseLogger) Debug

func (baselog *BaseLogger) Debug(msg string, args ...any)

func (*BaseLogger) Error

func (baselog *BaseLogger) Error(msg string, args ...any)

func (*BaseLogger) Fatal

func (baselog *BaseLogger) Fatal(msg string, args ...any)

func (*BaseLogger) FormatString

func (baselog *BaseLogger) FormatString(buf *[]byte, depth int, now time.Time, level, message string)

FormatString -- строчный режим вывода. Форматирует строку в заданном буфере порядок элементов в строке фиксирован: Level:{ yyyy-mm-dd hh:mm:ss.msec}{ file_name#line) | func_name#line }message\n {} -- опционально, если они есть. Склеиваются перед сообщением "как есть", разделять самостоятельно!

func (*BaseLogger) GetLevel

func (baselog *BaseLogger) GetLevel() int

func (*BaseLogger) Info

func (baselog *BaseLogger) Info(msg string, args ...any)

func (*BaseLogger) Init

func (baselog *BaseLogger) Init(cfg *LogConfig, retErr *error, args ...any) *BaseLogger

Init -- настройка логгера из структуры настроек @see ./config, возвращает себя (this) param Args -- доп. параметры конфигуратора (если надо!): тут можно задать маршаллер в json Ошибка открытия файла лога возвращается в параметре, исключительно для улучшения работы escape алгоритма.

func (*BaseLogger) OutMessage

func (baselog *BaseLogger) OutMessage(content *[]byte) error

OutMessage -- вывод сообщения в поток логирования(файл) или в никуда

func (*BaseLogger) Outlog

func (baselog *BaseLogger) Outlog(depth int, now time.Time, level, message string)

Outlog -- собственно форматилка лога и его вывод куда сказано. Ориентировочно: level=6 символов, date=11, time=9, micro=4, long/short file=32/16, message <120> итого ~182символа Аллоцируем тут, для обеспечения реентерабельности в горутинах.

func (*BaseLogger) Panic

func (baselog *BaseLogger) Panic(msg string, args ...any)

func (*BaseLogger) Warn

func (baselog *BaseLogger) Warn(msg string, args ...any)

type Errors

type Errors []error

func GetErrorList

func GetErrorList() Errors

GetErrorList -- получение списка ошибок за пределами пакета

type JsonMessage

type JsonMessage struct {
	Level    string `json:"Level"`
	DateTime string `json:"date_time"`
	FuncName string `json:"func_name"`
	FileName string `json:"file_name"`
	LineNum  int    `json:"line_num"`
	Message  string `json:"message"`
}

JsonMessage -- структура сообщения для маршалирования лога

type Levelable

type Levelable interface {
	Debug(msg string, args ...any)
	Info(msg string, args ...any)
	Warn(msg string, args ...any)
	Error(msg string, args ...any)
	Fatal(msg string, args ...any)
	Panic(msg string, args ...any)
}

Levelable -- тот, кто умеет выводить разные сообщения с уровнем не ниже указанного

func NewBaseLogger

func NewBaseLogger(cfg *LogConfig, args ...any) (Levelable, error)

NewBaseLogger -- генератор (в куче!) нового логгера из настроек @see ./config.go param Args -- доп. параметры конфигуратора (если надо!): тут можно задать маршаллер в json

type LogConfig

type LogConfig struct {
	// "" по умолчанию в stderr, иначе полный путь к файлу лога или "stdout"|"devnul"
	Out string
	// IsJson формировать лог в JSON (true) или строками (false)?
	IsJson bool
	// Flags флаги отображения. ==0 вывод только сообщения через Sprintf
	Flags int
	// Level std: 60 - debug, 50 - info, 40 - warn, 30 - error, 20 - fatal, 10 - panic, <10 не выводим ничего.
	// позволяет в обертках применить расширение уровней на свое усмотрение..
	Level int
	// TraceId идент сквозной трассировки. Может приходить в контексте для CtxLogger
	TraceId string
}

LogConfig -- настройки для инициализации логгеров. Одна структура на все типы. Если чего-то у логгера нет, то можно проигнорировать данный параметр тут.

func NewLogConfig

func NewLogConfig() *LogConfig

NewLogConfig returns application config instance

func (*LogConfig) Init

func (cfg *LogConfig) Init() *LogConfig

Init -- формирование настроек. Возвращает this

type LogJsonHandler

type LogJsonHandler func(buf *[]byte, depth int, now time.Time, level, message string) error

LogJsonHandler -- обработчик преобразования сообщения в json м.б. внешним

type Loggable

type Loggable interface {
	// GetLevel -- получить наименьший разрешенный уровень сообщений
	GetLevel() int
	// Outlog -- вывести сообщение с заданной глубины вызовов, от времени, с таким уровнем, текстом и аргументами
	Outlog(depth int, now time.Time, level, message string)
}

Loggable -- Тот, кто умеет выводить сообщения разного уровня в логгер:

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL