Categorygithub.com/gota33/aliyun-log-writer
repositorypackage
0.0.3
Repository: https://github.com/gota33/aliyun-log-writer.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

Aliyun Log Writer

godoc reference

此 Writer 用于将通过 Go 1.21 及以上版本 slog 记录的 JSON 格式日志发送到阿里云日志服务.

特点:

  • 采用非阻塞设计, 由一个后台线程将日志批量刷到远端日志库.
  • 采用轻量级设计, 直接使用 PutLogs 接口, 不依赖于 阿里云SDK
  • 除了 slog 也适用于推送其他日志库所记录的 JSON 格式日志

安装

go get -u github.com/gota33/aliyun-log-writer

使用指南

package main

import (
	"log"
	"log/slog"
	"os"
	"time"

	sls "github.com/gota33/aliyun-log-writer"
	"github.com/gota33/aliyun-log-writer/filters"
	"github.com/gota33/aliyun-log-writer/handlers"
	"github.com/gota33/aliyun-log-writer/modifiers"
)

func main() {
	// DEBUG 模式开关
	// sls.SetDebug(true)

	// Config 字段详细说明请看 Config 的字段注释
	writer, err := sls.New(sls.Config{
		Endpoint:     os.Getenv("APP_ENDPOINT"), // 阿里云日志接入端点, 如: cn-hangzhou-intranet.log.aliyuncs.com
		AccessKey:    os.Getenv("APP_KEY"),      // App Key
		AccessSecret: os.Getenv("APP_SECRET"),   // App 密钥
		Project:      os.Getenv("APP_PROJECT"),  // 日志 Project
		Store:        os.Getenv("APP_STORE"),    // 日志 Store
		Topic:        os.Getenv("APP_TOPIC"),    // 日志 topic 字段
		Source:       "",                        // 可选 日志 source 字段, 默认为 Hostname
		Timeout:      10 * time.Second,          // 可选 Push 数据超时时间, 默认 1s
		UseHttps:     false,                     // 可选 是否使用 https 调用 PutLogs 接口 (若接入端点是公网建议 https)
		// 可选的错误回调
		OnError: func(err error) {
			log.Printf("[EXAMPLE] error: %s", err)
		},
		// 可选的日志修改
		MessageModifier: modifiers.Chain{
			modifiers.RemapLevelToSysLog(), // 将 slog 的 level 字段重写成 syslog 格式
			modifiers.RenameMessageField(), // 将 slog 的 msg 字段重命名成 message
		},
		// 可选的日志过滤
		MessageFilter: filters.Chain{
			filters.InfoLevel(), // 只推送 Info 及以上 Level 到服务器
		},
	})
	if err != nil {
		panic(err)
	}

	// 进程结束前把存量日志推送到阿里云
	defer func() { _ = writer.Close() }()

	// remoteHandler 将日志写入阿里云
	remoteHandler := slog.NewJSONHandler(writer, &slog.HandlerOptions{
		Level:     slog.LevelInfo,
		AddSource: false,
	})

	// localHandler 将日志打印到本地控制台
	localHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		Level:     slog.LevelDebug,
		AddSource: true,
	})

	// 串联两个 Handler, 使 DEBUG 级别及以上打印到控制台, INFO 级别及以上推送到阿里云
	handler := handlers.MultiHandler(remoteHandler, localHandler)

	// 一些 slog 的常见用法
	logger := slog.New(handler).With("service", "demo")

	logger.Info("Aliyun Log Writer 1111111111111")

	time.Sleep(1 * time.Second)

	logger.Debug("Second Log")

	group := logger.WithGroup("group")
	group.Info("array test", "arr", []int{1, 2, 3})
	group.Info("map test", "map", map[string]string{"field": "value"})
}

依赖项

.
  ├ google.golang.org/protobuf
  └ github.com/pierrec/lz4