Skip to content

crypolt/elogger

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

Go Logger - Высокопроизводительный логгер с буферизацией

Этот логгер предназначен для высоконагруженных систем, использует буферизацию и асинхронную обработку для высокой производительности.
Основан на sync.Pool для минимизации аллокаций памяти и использует каналы для асинхронной записи.


Использование

  1. Инициализация логгера
logger/logger.go

package logger

import (
	"testlogproject/pkg/logger"
)

	// Создаем логгер с буфером на 1000 сообщений
	// Не забудьте в параметре указать название сервиса
func InitLogger() *logger.Logger {
	mode := logger.Regular
	logger.Mode = mode

	return logger.InitLogger("service-log", 1000)
}

2. Запись логов разных уровней

log.Debug("Запрос к API", "Метод: GET", "URL: /api/data")
log.Info("Пользователь вошел", "ID: 12345")
log.Warning("Высокая нагрузка", "CPU: 90%", "RAM: 80%")
log.Error("Ошибка базы данных", fmt.Errorf("connection refused"))

3. Передача дополнительных параметров

Вы можете передавать строки, ошибки, структуры, числа, fmt.Println() и другие данные.

type User struct {
	ID    int
	Name  string
	Email string
}

user := User{ID: 1, Name: "test", Email: "test@example.com"}
log.Info("Информация о пользователе", user)

Пример JSON-вывода:

{
  "@timestamp": "2025-02-17T12:34:56Z",
  "@message": "Информация о пользователе",
  "@level": "INFO",
  "@channel": "service-log",
  "@source": "main.go:32",
  "@details": "{ID:1 Name:test Email:test@example.com}"
}

4. Использование fmt.Println() в логах

a, _ := fmt.Println("Ошибка при обработке данных")
log.Error("Ошибка при обработке", a)

5. Обработка переполнения буфера

Логгер использует буферизацию с каналами. Если буфер переполняется, сообщения не теряются в тишине — выводится предупреждение в stderr.

Пример вывода при переполнении буфера:

[LOGGER WARNING] Буфер логов переполнен! Сообщение пропущено: Ошибка базы данных

Что делать, если буфер переполнен?

Увеличьте размер буфера:

log := logger.NewLogger("service-log", 5000) // Было 1000, увеличили до 5000

Оптимизируйте логи: Оставляйте только важные сообщения.

Уменьшите нагрузку: Используйте goroutines или кэшируйте данные.

Пример работы с нагрузкой

// Логгер с буфером на 5 сообщений для теста overflow

log := logger.NewLogger("service-log", 5)

// Генерируем 10 логов (буфер переполнится)

for i := 0; i < 10; i++ {
	log.Info("Сообщение номер", i)
}

Дополнительная информация

6. Уровни логирования и их использование

Debug (log.Debug())

Используется для отладки, вывода технической информации. Примеры передачи данных:

log.Debug("Запрос к API", "Метод: GET", "URL: /api/data")
log.Debug("Значение переменной X", 42)
log.Debug("Ответ от сервера", map[string]string{"status": "ok"})
log.Debug("Объект пользователя", userStruct)

Info (log.Info())

Используется для общих событий, например успешных операций. Примеры передачи данных:

log.Info("Пользователь вошел", "UserID: 12345")
log.Info("Сервер запущен", "Версия: 1.2.3")
log.Info("Обработан платеж", struct{ Amount int }{Amount: 1000})

Warning (log.Warning())

Используется для предупреждений, возможных проблем в системе. Примеры передачи данных:

log.Warning("Долгое выполнение запроса", "Время: 2.5s")
log.Warning("Переполнение кэша", "Размер: 95%")
log.Warning("Попытка входа с неверным паролем", "IP: 192.168.1.10")

Error (log.Error())

Используется для ошибок, которые требуют внимания. Примеры передачи данных:

log.Error("Ошибка базы данных", fmt.Errorf("connection refused"))
log.Error("Ошибка чтения файла", err)
log.Error("Сбой авторизации", "UserID: 12345", fmt.Errorf("неверный токен"))

Fatal (log.Fatal())

Используется для критических ошибок, после которых программа завершает работу. Примеры передачи данных:

log.Fatal("Нехватка памяти", "Свободно: 0MB")
log.Fatal("Фатальная ошибка сети", fmt.Errorf("подключение разорвано"))
log.Fatal("Приложение не может запуститься", err)

Форматы передаваемых данных

Строки: "Текст ошибки"

Числа: 42, 1000, 3.14

Ошибки (error): fmt.Errorf("описание ошибки")

Структуры: userStruct, struct{Name string}{Name: "TEST"}

Мапы (map): map[string]string{"status": "ok"} // Лучше не использовать

Слайсы ([]interface{}): []string{"item1", "item2"}

Вывод fmt.Println(): a, _ := fmt.Println("Ошибка"); log.Error("Ошибка", a)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages