Логирование в Go через REST API
Один HTTP-POST из Go — и событие уже в клиенте Logger. Никаких агентов, коллекторов и стека хранилища: только доставка в реальном времени.
Отправка через net/http
Отправьте первое событие из Go за пару минут. Consumer Key выдаётся после регистрации в веб-интерфейсе.
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
const url = "https://logger.dp-projects.ru/sendmess"
func logEvent(module string, mess map[string]any) error {
payload := map[string]any{
"key": "ваш-consumer-key",
"module": module,
"mess": mess,
"mode": "regular",
}
body, _ := json.Marshal(payload)
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Post(url, "application/json", bytes.NewBuffer(body))
if err != nil {
return err
}
defer resp.Body.Close()
fmt.Println("Статус:", resp.Status)
return nil
}
func main() {
logEvent("payment-service", map[string]any{
"event": "payment_processed",
"amount": 1000,
"status": "success",
})
}
Обёртка над log/slog
Начиная с Go 1.21 в стандартной библиотеке есть log/slog. Свой Handler отправит структурированные записи в Logger, сохранив единый интерфейс логирования.
type LoggerAPIHandler struct {
Key string
Module string
}
func (h LoggerAPIHandler) Enabled(context.Context, slog.Level) bool { return true }
func (h LoggerAPIHandler) Handle(_ context.Context, r slog.Record) error {
attrs := map[string]any{"message": r.Message}
r.Attrs(func(a slog.Attr) bool {
attrs[a.Key] = a.Value.Any()
return true
})
payload, _ := json.Marshal(map[string]any{
"key": h.Key, "module": h.Module, "mess": attrs,
})
go http.Post(url, "application/json", bytes.NewBuffer(payload))
return nil
}
func (h LoggerAPIHandler) WithAttrs([]slog.Attr) slog.Handler { return h }
func (h LoggerAPIHandler) WithGroup(string) slog.Handler { return h }
logger := slog.New(LoggerAPIHandler{Key: "ваш-consumer-key", Module: "go-app"})
slog.SetDefault(logger)
Особенности логирования из Go
- 01
Идемпотентно просто
Обычный http.Client с таймаутом — никаких тяжёлых SDK.
- 02
Структурированные логи
mess принимает вложенные map, поэтому JSON-структуры из Go отображаются в клиенте как дерево.
- 03
Без серверного архива
Logger не хранит события на сервере — это сервис доставки в реальном времени.
Частые вопросы
Нужен ли Go-клиент Logger?
Нет, достаточно стандартной библиотеки. Пример на net/http полностью самодостаточен и не требует внешних зависимостей.
Как отправить вложенную структуру из Go?
Сериализуйте её в map[string]any или напрямую в JSON — поле mess принимает произвольный JSON.
Влияет ли логирование на производительность?
Отправляйте запрос в отдельной горутине (как в примере со slog.Handler), и логирование не будет блокировать обработку запросов.
Отправка логов из других языков
Поймайте следующее событие.
Откройте клиент, получите Consumer Key и отправьте первый лог из Go.