Golang Docker SDK ContainerLogs 获取完整日志信息
您正在尝试使用 Golang 的 Docker SDK 中的 ContainerLogs 方法获取容器日志,但发现返回的日志信息只包含 message 和 timestamp 两列,而缺少 stream 信息?这可能是因为您没有正确配置 types.ContainerLogsOptions 参数。
为了获取完整的日志信息,您需要使用 types.ContainerLogsOptions 参数中的 types.ContainerLogsOptions.Stream 选项来请求实时日志流。以下是一个示例代码:
package main
import (
"context"
"fmt"
"io"
"time"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
options := types.ContainerLogsOptions{
Follow: true,
ShowStdout: true,
ShowStderr: true,
Timestamps: true,
Stream: true, // 关键选项,请求实时日志流
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
reader, err := cli.ContainerLogs(ctx, "my-container-id", options)
if err != nil {
panic(err)
}
defer reader.Close()
buf := make([]byte, 4096)
for {
n, err := reader.Read(buf)
if err != nil {
if err == io.EOF {
break
}
panic(err)
}
fmt.Print(string(buf[:n]))
}
}
在这个代码中,我们使用 types.ContainerLogsOptions 结构体配置日志选项,并使用 cli.ContainerLogs 方法获取日志流。然后,我们使用 io.Reader 接口读取日志流并将其打印到控制台。请注意,options.Stream 选项设置为 true 来请求实时日志流。如果您不需要实时日志流,可以将其设置为 false。
通过使用 types.ContainerLogsOptions.Stream 选项,您将能够获取完整的容器日志信息,包括 message、timestamp 和 stream 信息。
原文地址: https://www.cveoy.top/t/topic/kNl2 著作权归作者所有。请勿转载和采集!