【测试平台系列】第一章 手撸压力机(六)- 日志服务及使用yaml配置文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 上一章节我们封装TO(测试对象),方便我们以后扩展其他被测的接口或协议。本章我们主要实现以下,我们的日志输出。

上一章节我们封装TO(测试对象),方便我们以后扩展其他被测的接口或协议。本章我们主要实现以下,我们的日志输出。在以前的章节中,我们都是使用go的fmt包进行日志输出(打印到控制台),在工作中我们都知道,我们的服务都是由日志文件,以及日志级别的。下面我们就实现以下,将指定的级别的日志,输出到日志文件中。
我们在项目中新建global目录并在global目录下新建log目录,结构如下:
kitchen-engine/global/log/logger.go

package log

import (
        "github.com/natefinch/lumberjack"
        "go.uber.org/zap"
        "go.uber.org/zap/zapcore"
        "os"
)

// 声明一个zap包的SugaredLogger指针
var Logger *zap.SugaredLogger

var Logger *zap.SugaredLogger

// 获取一个异步io.Write
func getWriteSyncer(path string, maxSize, maxBackups, maxAge int, compress bool) zapcore.WriteSyncer {
        lumberJackLogger := &lumberjack.Logger{}
        // 日志文件的位置
        if path == "" {
                path = "./runner"
        }
        lumberJackLogger.Filename = path

        // 在进行切割之前,日志文件的最大大小,MB
        if maxSize != 0 {
                lumberJackLogger.MaxSize = maxSize
        }

        // 保留旧文件的最大个数
        if maxBackups != 0 {
                lumberJackLogger.MaxBackups = maxBackups
        }

        // 旧文件保留的时间天数
        if maxAge != 0 {
                lumberJackLogger.MaxAge = maxAge
        }

        // 是否压缩/归档旧文件
        if compress {
                lumberJackLogger.Compress = true
        }

        return zapcore.AddSync(lumberJackLogger)
}

// InitLogger 初始化日志模块
func InitLogger() {

        // 设置日志的基本格式,使用开发模式
        encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())

    // 大于等于warn的日志级别
        errLogger := zap.LevelEnablerFunc(func(level zapcore.Level) bool {
                return level >= zapcore.WarnLevel
        })

    // 小于等于warn的日志级别
        infoLogger := zap.LevelEnablerFunc(func(level zapcore.Level) bool {
                return level <= zapcore.WarnLevel
        })

        // 配置输出到控制台
        consoleSyncer := zapcore.AddSync(os.Stdout)
        // 详细日志输出到info日志文件
        info := getWriteSyncer("./runner-go-info.log", 100, 5, 10, false)
        // 错误日志输出到错误日志文件
        errSync := getWriteSyncer("./runner-go-err.log", 100, 5, 10, false)
        core := zapcore.NewTee(
                zapcore.NewCore(encoder, info, infoLogger),
                zapcore.NewCore(encoder, consoleSyncer, zap.DebugLevel),
                zapcore.NewCore(encoder, errSync, errLogger))

        Logger = zap.New(core, zap.AddCaller()).Sugar()
}

这样,我们就把日志的模块,配置完了。
我们可以使用单元测试,自测以下。在go中使用单元测试,我们直接新建一个
kitchen-engine/global/log/logger_test.go

package log

import (
        "testing"
)

// 使用go单元测试,直接Test+方法名
func TestInitLogger(t *testing.T) {
        // 初始化日志配置
        InitLogger()
        // 打印debug级别的日志
        Logger.Debug("你好我好,大家好")
        // 打印错误级别的日志
        Logger.Error("错误哦错误")
}

然后,我们直接运行该方法即可,不用在main函数中去使用。这样,我们在控制台,可以看到如下日志:

=== RUN   TestInitLogger
2023-06-15T14:05:49.896+0800        DEBUG        log/logger_test.go:15        你好  我好,大家好
2023-06-15T14:05:49.910+0800        ERROR        log/logger_test.go:16        错误  哦错误
--- PASS: TestInitLogger (0.02s)
PASS
Process finished with the exit code 0

同时在我们的log文件夹下,分别多了runner-go-info.log和runner-go-err.log
​编辑
刚才我们使用单元测试对日志模块进行了自测,可以正常使用。
下面我们为了,更灵活的配置日志,我们采用配置文件的方式来进行配置。
在global目录下新建global/config/config.go


package config

import (
        "flag"
        "fmt"
)
import "github.com/spf13/viper"

var YC YamlConfig

type YamlConfig struct {
        Log Log yaml:"log"
}

type Log struct {
        Env          string yaml:"env"            // 环境
        InfoLogPath  string yaml:"info_log_path"  // 详细日志的文件地址
        ErrLogPath   string yaml:"err_log_path"   // 错误日志的文件地址
        IsConsoleLog bool   yaml:"is_console_log" // 是否将日志输出到控制台
}

// InitConfig 初始化YamlConfig结构体,将配置文件读取到内存中
func InitConfig() {

        var file string
        // go语言命令行工具
        flag.StringVar(&file, "f", "../../open.yaml", "配置文件,默认为根目录下的open.yaml")
        if !flag.Parsed() {
                flag.Parse()
        }

        viper.SetConfigFile(file)
        // 读取的配置文件为yaml文件类型
        viper.SetConfigType("yaml")

        if err := viper.ReadInConfig(); err != nil {
                panic(fmt.Sprintf("读取配置文件: %s 失败!", file))
        }

        if err := viper.Unmarshal(&YC); err != nil {
                panic(fmt.Sprintf("配置文件: %s, 匹配: %v类型失败!", file, YC))
        }
        fmt.Println(fmt.Sprintf("配置文件:%s初始化成功", file))
}

在项目的根目录,我们新建open.yaml(配置文件)。

log:
  env: "test"            # 环境
  Info_log_path: "./runner-go-info.log"  # 详细日志的文件地址
  err_log_path: "./runner-go-err.log"   # 错误日志的文件地址
  is_console_log: true # 是否将日志输出到控制台

我们去main.go中对配置文件和日志配置,进行测试。
main.go

package main

import (
        "kitchen-engine/global/config"
        "kitchen-engine/global/log"
)

// 初始化函数,在main函数之前运行
func init() {
        // 初始化配置信息
        config.InitConfig()
        // 初始化日志配置
        log.InitLogger()
}

func main() {

        log.Logger.Debug("yc:   ", config.YC)
        //// 一个类型中的字段,可以重置,也可以使用默认值,在go中,所有的类型的初始值,都是字段类型的0值,比如string的初始值是""空字符串,int类型的初始值是0等等
        //httpClientSettings := model.HttpClientSettings{
        //        Name:                     "测试厨房",
        //        NoDefaultUserAgentHeader: true,
        //        MaxConnDuration:          1000,
        //        AdvancedOptions: model.AdvancedOptions{
        //                Tls: model.Tls{
        //                        IsVerify:   true,
        //                        VerifyType: 1,
        //                },
        //        },
        //}
        //
        //headers := []model.Header{
        //        model.Header{
        //                Field: "name",
        //                Value: "你好",
        //        },
        //}
        //
        //httpRequest := model.HttpRequest{
        //        Url:                "https://www.baidu.com",
        //        Method:             "GET",
        //        HttpClientSettings: httpClientSettings,
        //        Headers:            headers,
        //}
        //
        //client.RequestHttp(httpRequest)
        log.Logger.Info("欢迎使用zap日志")
}

这样,我们就可以修改我们的日志初始化的配置。
logger.go

// InitLogger 初始化日志模块
func InitLogger(yc config.YamlConfig) {

   // 设置日志的基本格式,使用开发模式
   encoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())

   // 大于等于warn的日志级别
   errLogger := zap.LevelEnablerFunc(func(level zapcore.Level) bool {
      return level >= zapcore.WarnLevel
   })

   // 小于等于warn的日志级别
   infoLogger := zap.LevelEnablerFunc(func(level zapcore.Level) bool {
      return level <= zapcore.WarnLevel
   })

   // 配置输出到控制台
   consoleSyncer := zapcore.AddSync(os.Stdout)
   // 详细日志输出到info日志文件
   info := getWriteSyncer(yc.Log.InfoLogPath, 100, 5, 10, false)
   // 错误日志输出到错误日志文件
   errSync := getWriteSyncer(yc.Log.ErrLogPath, 100, 5, 10, false)
   core := zapcore.NewTee(
      zapcore.NewCore(encoder, info, infoLogger),
      zapcore.NewCore(encoder, consoleSyncer, zap.DebugLevel),
      zapcore.NewCore(encoder, errSync, errLogger))

   Logger = zap.New(core, zap.AddCaller()).Sugar()
}

main.go


package main

import (
   "kitchen-engine/global/config"
   "kitchen-engine/global/log"
)

// 初始化函数,在main函数之前运行
func init() {
   // 初始化配置信息
   config.InitConfig()
   // 初始化日志配置
   log.InitLogger(config.YC)
}

今天的内容就到这里,其他配置项如果也想修改的,可以自行配置及变更。这样可以更方便、更灵活的使用。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
关系型数据库 MySQL 测试技术
【分享】AgileTC测试用例管理平台使用分享
AgileTC 是一个脑图样式测试用例管理平台,支持用例设计、执行与团队协作,帮助测试人员高效管理测试流程。
272 116
【分享】AgileTC测试用例管理平台使用分享
|
3月前
|
人工智能 数据可视化 测试技术
AI测试平台自动遍历:低代码也能玩转全链路测试
AI测试平台的自动遍历功能,通过低代码配置实现Web和App的自动化测试。用户只需提供入口链接或安装包及简单配置,即可自动完成页面结构识别、操作验证,并生成可视化报告,大幅提升测试效率,特别适用于高频迭代项目。
|
3月前
|
人工智能 测试技术 调度
写用例写到怀疑人生?AI 智能测试平台帮你一键生成!
霍格沃兹测试开发学社推出AI智能测试用例生成功能,结合需求文档一键生成高质量测试用例,大幅提升效率,减少重复劳动。支持自定义提示词、多文档分析与批量管理,助力测试人员高效完成测试设计,释放更多时间投入核心分析工作。平台已开放内测,欢迎体验!
|
3月前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
4月前
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
3月前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
4月前
|
存储 人工智能 文字识别
从零开始打造AI测试平台:文档解析与知识库构建详解
AI时代构建高效测试平台面临新挑战。本文聚焦AI问答系统知识库建设,重点解析文档解析关键环节,为测试工程师提供实用技术指导和测试方法论
|
3月前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
102 4
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件