Skip to content

gota33/aliyun-log-writer

Repository files navigation

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

About

Write log to Aliyun log service

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages