Этот логгер предназначен для высоконагруженных систем, использует буферизацию и асинхронную обработку для высокой производительности.
Основан на sync.Pool для минимизации аллокаций памяти и использует каналы для асинхронной записи.
- Инициализация логгера
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)
}log.Debug("Запрос к API", "Метод: GET", "URL: /api/data")
log.Info("Пользователь вошел", "ID: 12345")
log.Warning("Высокая нагрузка", "CPU: 90%", "RAM: 80%")
log.Error("Ошибка базы данных", fmt.Errorf("connection refused"))Вы можете передавать строки, ошибки, структуры, числа, 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}"
}a, _ := fmt.Println("Ошибка при обработке данных")
log.Error("Ошибка при обработке", a)Логгер использует буферизацию с каналами. Если буфер переполняется, сообщения не теряются в тишине — выводится предупреждение в 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)
}
Используется для отладки, вывода технической информации. Примеры передачи данных:
log.Debug("Запрос к API", "Метод: GET", "URL: /api/data")
log.Debug("Значение переменной X", 42)
log.Debug("Ответ от сервера", map[string]string{"status": "ok"})
log.Debug("Объект пользователя", userStruct)
Используется для общих событий, например успешных операций. Примеры передачи данных:
log.Info("Пользователь вошел", "UserID: 12345")
log.Info("Сервер запущен", "Версия: 1.2.3")
log.Info("Обработан платеж", struct{ Amount int }{Amount: 1000})
Используется для предупреждений, возможных проблем в системе. Примеры передачи данных:
log.Warning("Долгое выполнение запроса", "Время: 2.5s")
log.Warning("Переполнение кэша", "Размер: 95%")
log.Warning("Попытка входа с неверным паролем", "IP: 192.168.1.10")
Используется для ошибок, которые требуют внимания. Примеры передачи данных:
log.Error("Ошибка базы данных", fmt.Errorf("connection refused"))
log.Error("Ошибка чтения файла", err)
log.Error("Сбой авторизации", "UserID: 12345", fmt.Errorf("неверный токен"))
Используется для критических ошибок, после которых программа завершает работу. Примеры передачи данных:
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)