首页 > 其他分享 >go实现对容器日志的读取并通过api展示

go实现对容器日志的读取并通过api展示

时间:2023-07-27 19:55:46浏览次数:39  
标签:容器 http err fmt content api go 日志

场景

工作环境中,用容器部署服务是很常见的操作,而新上线的业务,测试人员需要对服务进行测试

但是一下几种可能,使得测试人员并不能方便的查看日志:

  • 有的测试人员docker并不熟
  • 权限比较严格,测试人员没权限操作容器
  • 临时需要查看日志

第一第二中情况咱就不说了,第三种情况,如果只是临时需要,咱们其实没必要特意去接入日志服务

只需要写个服务,将读取到的日志通过api返回出去就好了,又不会占用很多资源,又能随起随停

代码部分

package main

import (
	"bufio"
	"context"
	"fmt"
	"net/http"
	"strconv"
	"time"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/client"
	"github.com/gin-gonic/gin"
)

var (
	host             = "10.0.0.12"
	RemoteDockerHost = "tcp://" + host + ":2376"
	CaPath           = "cert/" + host + "/ca.pem"
	ClientCertPath   = "cert/" + host + "/cert.pem"
	ClientKeyPath    = "cert/" + host + "/key.pem"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		containerName := c.DefaultQuery("c", "mysql")
		n := c.DefaultQuery("n", "1000")
		ccc, err := strconv.ParseInt(n, 10, 64)
		if err != nil {
			fmt.Println("参数转化失败:", err)
			c.String(http.StatusBadRequest, "传参有误")
			c.Abort()
			return
		}

		// 创建Docker客户端并指定远程Docker守护进程地址
		cli, err := client.NewClientWithOpts(
			client.WithHost(RemoteDockerHost),
			// client.WithVersion("1.41"),
			client.WithAPIVersionNegotiation(),
			client.WithTLSClientConfig(CaPath, ClientCertPath, ClientKeyPath),
		)
		if err != nil {
			fmt.Println("创建容器失败:", err)
			c.String(http.StatusBadRequest, "容器访问失败")
			c.Abort()
			return
		}
		_, err = cli.ContainerInspect(c.Request.Context(), containerName)
		if err != nil {
			fmt.Println("容器查询失败:", err)
			c.String(http.StatusBadRequest, "容器不存在")
			c.Abort()
			return
		}
		// fmt.Println(containerInfo)
		option := types.ContainerLogsOptions{
			ShowStdout: true,
			ShowStderr: true,
			Follow:     true,
			// Timestamps: true,
			Tail: n,
		}
		cxt, cancel := context.WithTimeout(c.Request.Context(), 500*time.Millisecond)
		defer cancel()
		out, err := cli.ContainerLogs(cxt, containerName, option)
		if err != nil {
			fmt.Println(err.Error())
			c.String(http.StatusBadRequest, "容器日志访问失败")
			c.Abort()
			return
		}
		defer out.Close()
		scanner := bufio.NewScanner(out)
		// defer cancel()
		num := int64(0)
		var content []byte
		for scanner.Scan() {
			num++
			buf := scanner.Bytes()
			if len(buf) > 8 {
				content = append(content, scanner.Bytes()[8:]...)
			}
			if num != 1 {
				content = append(content, '\n')
			}
			if num >= ccc {
				cancel()
			}
		}
		c.Data(http.StatusOK, "text/plain; charset=utf-8", content)
	})
	r.Run(":50000")
}

因为go语言的特性,对资源消耗比较小,而且非常容易编译成二进制可执行文件,所以能非常好的解决上面的需求

使用

起的服务是50000端口的,然后可以接受两个查询参数

  • c,表示容器ID,可以是容器ID,也可以是容器名,默认是mysql容器
  • n,表示查询的最后的行数,默认是1000行

这样就可以通过查询参数的方式查询主机上的任意容器的日志,当然,觉得不安全,也可以设置黑白名单之类的,这里就不做处理了

标签:容器,http,err,fmt,content,api,go,日志
From: https://www.cnblogs.com/guangdelw/p/17585875.html

相关文章

  • Python基础day54 Django2
    配置文件的介绍#注册应用的INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.......
  • elk日志采集系统
    下载地址:https://elasticsearch.cn/download/安装包:mkdirelkcdelk wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.1-x86_64.rpmwgethttps://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.5.1-x86_64.rpmwgethttps:/......
  • Apipost变量高亮展示,变量操作更流畅
    之前Apipost配置的各种环境变量只能在右上角环境管理中查看,很多小伙伴希望能有一种更好的解决方案用以快速复制变量值,快速查看变量的当前值和初始值,于是在Apipost7.1.7中我们推出环境变量高亮展示功能来满足用户的使用需求。功能描述:当用户在请求地址、以及参数值设置中引用到变量......
  • RunnerGo:详细使用教程,带你轻松拿捏性能测试
    RunnerGo简介:RunnerGo是基于go语言开发的轻量级性能测试平台,支持接口测试、自动化测试、性能测试等3大测试模块,相对于传统的性能测试工具,它具有运行速度快、资源占用少等特点。并且还支持可实时查看性能测试报告的平台RunnerGo的优势:1.RunnerGo运行速度更快,更节省资源采用go......
  • VS 还原 NuGet 程序包时出错: 无法加载源 https://dotnet.myget.org/F/aspnetcore-dev
    错误还原NuGet程序包时出错:无法加载源https://dotnet.myget.org/F/aspnetcore-dev/api/v3解决方法在新源中添加地址:https://www.nuget.org/api/v2/......
  • Apipost变量高亮展示,变量操作更流畅
    之前Apipost配置的各种环境变量只能在右上角环境管理中查看,很多小伙伴希望能有一种更好的解决方案用以快速复制变量值,快速查看变量的当前值和初始值,于是在Apipost7.1.7中我们推出环境变量高亮展示功能来满足用户的使用需求。功能描述:当用户在请求地址、以及参数值设置中引用到......
  • docker run 日志
    Docker运行日志详解Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包成一个独立的、可移植的容器,以实现快速部署和跨平台运行。在使用Docker时,了解和分析容器的运行日志是非常重要的。本文将介绍如何使用dockerrun命令来查看容器的日志,并提供一些常用的技巧和......
  • Golang中结构体映射mapstructure库深入详解
    mapstructure用于将通用的map[string]interface{}解码到对应的 Go 结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断 +目录在数据传递时,需要先编解码;常用的方式是JSON编解码......
  • FastPrint开发日志
    2023.7.271.MEF插件框架   DirectoryCatalog扫描指定目录路径中的DLL文件时不能识别带'.'的DLL例如:ICSharpCode.TextEditor.dll2.关于System.Data.SQLite.dll 如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“AnyCPU” 但是Syste......
  • 配置文件的介绍,静态文件的配置,request对象请求方法,pycharm连接数据库,Django连接My
    配置文件的介绍#注册应用的INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.c......