chLogger — это высокопроизводительный, асинхронный логгер для Go, построенный на основе каналов (channels) и паттерна worker-pool.
Проект создан для минимизации I/O задержек в основном потоке приложения. Оптимизирован для high-throughput инжеста данных: логи отправляются в неблокирующий канал и обрабатываются отдельными горутинами-миньонами. Не требует импорта тяжеловесных структур — всё работает на стандартных типах Go.
- Асинхронность "из коробки": Логи пишутся в буферизированный канал
ChInLog chan [4]string, не блокируя выполнение бизнес-логики. - Pub/Sub Архитектура и Расширяемость: Возможность транслировать логи любым подписчикам (через канал
Broadcast) без изменения ядра логгера. - Real-time WebSocket трансляция: Встроенный плагин
wsLoggerPluginподнимает веб-сервер с готовым UI для стриминга логов прямо в браузер. - HTTP RPC Input: Логгер может выступать как самостоятельный сервис, принимая JSON-сообщения по HTTP для логирования событий из других микросервисов.
- Гибкая маршрутизация и фильтрация: Возможность фильтрации вывода по имени функции и модулю. Автоматическое группирование логов и ошибок по отдельным файлам.
Взаимодействие с логгером максимально упрощено. Вам не нужно тянуть сложные типы, достаточно отправить в канал массив из 4-х строк ([4]string):
[0]Func — Наименование функции (или "nil"). Используется для фильтрации (ConsolFilterFn).[1]Unit — Название пакета/объекта (модуля). Используется для фильтрации (ConsolFilterUn).[2]Text — Непосредственно текст лога / полезная нагрузка.[3]Status — Статус сообщения. Ошибка маркируется как"1"или"ERROR", нормальное выполнение —""или"0".
Поскольку логи ставятся в очередь (буфер канала), при неожиданном (hard crash / panic) завершении программы часть логов может быть потеряна.
Для гарантии записи всех сообщений необходимо использовать методы корректного завершения (Stop()), которые дождутся очистки каналов перед выходом.
go get github.com/xela07ax/chLogger
package main
import (
"fmt"
"[github.com/xela07ax/chLogger](https://github.com/xela07ax/chLogger)"
"time"
)
func main() {
// 1. Конфигурируем логгер
logEr := chLogger.NewChLoger(&chLogger.Config{
ConsolFilterFn: map[string]int{"Front Http Server": 0},
ConsolFilterUn: map[string]int{"Pooling": 1},
Mode: 0,
Dir: "x-loger", // Директория для файлов логов
})
// 2. Запускаем демона (миньонов)
logEr.RunLogerDaemon()
// 3. Отправляем логи: [Func, Unit, Text, Status]
logEr.ChInLog <- [4]string{"Welcome", "nil", "Система успешно запущена", "0"}
logEr.ChInLog <- [4]string{"Database", "Connection", "Таймаут подключения", "1"} // 1 = Ошибка
// Эмуляция работы
time.Sleep(1 * time.Second)
// 4. Корректное завершение (дожидаемся записи всех логов)
logEr.Stop()
}Благодаря канальной архитектуре, вы не ограничены только записью в файл или консоль. [cite_start]Вы можете передать в конфигурацию любой канал, и логгер будет транслировать туда все события.
Это позволяет легко интегрировать логгер с внешними системами:
package main
import (
"fmt"
"[github.com/xela07ax/chLogger](https://github.com/xela07ax/chLogger)"
)
func main() {
// 1. Создаем канал для нашего кастомного подписчика
myCustomSubscriber := make(chan []byte, 100)
// 2. Передаем его в логгер
cfg := &chLogger.Config{
Mode: 1,
Dir: "./logs",
Broadcast: myCustomSubscriber, // <--- Интеграция здесь
}
logger := chLogger.NewChLoger(cfg)
logger.RunLogerDaemon()
// 3. Запускаем консьюмера в отдельной горутине
go func(in <-chan []byte) {
for msg := range in {
// Здесь может быть абсолютно любая логика:
// - Отправка HTTP-запроса в ElasticSearch
// - Публикация в брокер сообщений (RabbitMQ / Kafka)
// - Отправка алертов об ошибках в Telegram / Slack
fmt.Printf("Кастомный подписчик получил лог: %s\n", string(msg))
}
}(myCustomSubscriber)
// Отправляем тестовый лог
logger.ChInLog <- [4]string{"System", "Network", "Подключение установлено", "OK"}
logger.Stop()
}Логгер поставляется со встроенным хабом для трансляции логов в веб-браузер.
hub := wsLoggerPlugin.NewWsLogger()
go hub.Run()
// Логгер отправляет данные в hub.broadcast, а хаб раздает их клиентам
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
hub.ServeWs(w, r)
})