Golang中如何将slog日志发送至本地主机API端点
将Go的slog日志发送到本地API端点(基于Dial和io.Writer实现)
需求说明
当前代码将slog日志输出到控制台,需改为通过net.Dial建立连接,把JSON或文本格式的日志发送到本地API端点,核心是利用io.Writer完成日志传输。
方案1:直接通过TCP连接发送日志(适用于TCP服务型API)
如果本地API是TCP协议服务,可直接将TCP连接作为io.Writer传给slog的Handler,实现日志直接发送:
import ( "log/slog" "net" "os" "time" ) func main() { v1 := "10" v2 := "bada" // 建立到本地TCP API的连接(示例端口9000,需替换为实际API端口) conn, err := net.Dial("tcp", "localhost:9000") if err != nil { // 实际项目请替换为优雅错误处理,比如写入本地应急日志 panic(err) } defer conn.Close() // 确保程序退出时关闭连接 // 设置连接超时,避免长时间阻塞 conn.SetDeadline(time.Now().Add(5 * time.Second)) // 选择日志格式:JSON或文本 // 若需文本格式,替换为slog.NewTextHandler(conn, nil) logger := slog.New(slog.NewJSONHandler(conn, nil)) // 测试日志输出 logger.Info("user operation", "id", v1, "action", v2) logger.Error("invalid input", "received", v2, "code", v1) }
关键说明
net.Dial建立TCP连接后,conn本身实现了io.Writer接口,可直接作为slogHandler的输出目标。- 日志格式可通过切换
NewJSONHandler/NewTextHandler灵活调整,适配API格式要求。 - 务必通过
defer关闭连接,避免资源泄漏。
方案2:通过HTTP POST发送日志(适用于HTTP型API)
如果本地API是HTTP POST接口(比如http://localhost:8080/logs),可自定义实现io.Writer的结构体,将日志封装为HTTP请求发送:
import ( "bytes" "log/slog" "net" "net/http" "os" ) // HTTPWriter 自定义Writer,将日志作为HTTP POST请求发送到指定端点 type HTTPWriter struct { apiEndpoint string // 比如 "/logs" serverAddr string // 比如 "localhost:8080" } func (w *HTTPWriter) Write(p []byte) (n int, err error) { // 建立到HTTP服务器的TCP连接 conn, err := net.Dial("tcp", w.serverAddr) if err != nil { return 0, err } defer conn.Close() // 构造POST请求,日志内容作为请求体 req, err := http.NewRequest("POST", w.apiEndpoint, bytes.NewReader(p)) if err != nil { return 0, err } // 根据日志格式设置Content-Type req.Header.Set("Content-Type", "application/json") // 发送请求到API err = req.Write(conn) if err != nil { return 0, err } // 可选:读取API响应,确认日志发送成功 _, err = http.ReadResponse(http.NewResponseReader(conn), req) if err != nil { return 0, err } return len(p), nil } func main() { v1 := "10" v2 := "bada" // 初始化HTTPWriter,指向本地API httpWriter := &HTTPWriter{ apiEndpoint: "/logs", serverAddr: "localhost:8080", } // 使用JSON格式日志发送到API logger := slog.New(slog.NewJSONHandler(httpWriter, nil)) // 测试日志 logger.Info("http log entry", "v1", v1, "v2", v2) logger.Warn("resource warning", "type", "memory", "usage", "85%") }
优化建议
- 连接复用:示例每条日志都建立新连接,高并发场景可添加连接池复用TCP连接,减少开销。
- 错误降级:若API不可用,可添加 fallback 逻辑,将日志临时写入本地文件或控制台。
- 批量发送:可在
HTTPWriter中缓存多条日志,达到阈值后批量发送,提升效率。
内容的提问来源于stack exchange,提问作者IrishGringo
相关产品推荐
相关产品推荐

