You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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接口,可直接作为slog Handler的输出目标。
  • 日志格式可通过切换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:33:16