go语言读取docker容器的日志

发布时间 2023-07-18 11:21:20作者: 厚礼蝎

使用Docker SDK:

要使用Docker SDK来读取Docker容器的日志,您需要安装Docker SDK并使用其提供的函数进行操作。

安装Docker SDK:

go get -u github.com/docker/docker

获取容器ID

# 短ID
docker ps
CONTAINER ID   IMAGE       COMMAND       CREATED      STATUS         PORTS NAMES
3a09b0e99be9   nginx:latest   "nginx -g 'dae..."  2 hours ago   Up 2 hours   80/tcp   my-nginx

# 长ID
docker inspect <container_name_or_id> --format='{{.Id}}'

# 例如
docker inspect my-nginx --format='{{.Id}}'

获取当前docker的API版本

docker version
Client: Docker Engine - Community
 Version:           20.10.18
 API version:       1.41
 Go version:        go1.18.6
 Git commit:        b40c2f6
 Built:             Thu Sep  8 23:14:08 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.18
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.6
  Git commit:       e42327a
  Built:            Thu Sep  8 23:12:21 2022
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

代码部分

package main

import (
	"context"
	"fmt"
	"io"
	"os"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
)

func readContainerLogs(containerID string) error {
	cli, err := client.NewClientWithOpts(client.WithVersion("1.41")) // 根据您的Docker版本选择合适的API版本
	if err != nil {
		return err
	}

	options := types.ContainerLogsOptions{
		ShowStdout: true,
		ShowStderr: true,
		Follow:     true,
		Tail:       "50", // 获取最后50行日志,根据需求调整
	}

	out, err := cli.ContainerLogs(context.Background(), containerID, options)
	if err != nil {
		return err
	}

	defer out.Close()

	// 从日志流中读取并处理日志行
	buf := make([]byte, 1024)
	for {
		n, err := out.Read(buf)
		if err != nil {
			if err == io.EOF {
				// 读取完成
				break
			}
			return err
		}

		logLine := string(buf[:n])
		// 处理日志行,例如打印到控制台或保存到文件
		fmt.Print(logLine)
	}

	return nil
}

func main() {
	containerID := "3a09b0e99be9" // 将此处替换为要读取日志的容器ID
	err := readContainerLogs(containerID)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}