首页 > 其他分享 >Golang(Go语言)封装一个简单的控制台输出包

Golang(Go语言)封装一个简单的控制台输出包

时间:2024-06-04 13:47:05浏览次数:11  
标签:封装 31 Golang test Go 控制台

// 定义6个常量,每个常量代表一个布尔值为true的位置
const (
	LEVEL_DEBUG = 1 << iota
	LEVEL_INFO
	LEVEL_WARN
	LEVEL_ERROR
	LEVEL_FATAL
	PRINT_SRC_FILE
)

type consoleFunc func(format string, a ...any)

var printSrcFileEmptyFunc = func() {}

type Console struct {
	Debug consoleFunc
	Info  consoleFunc
	Warn  consoleFunc
	Error consoleFunc
	Fatal consoleFunc
}

func NewConsole(params int) *Console {
	levelDebug := params&LEVEL_DEBUG != 0
	levelInfo := params&LEVEL_INFO != 0
	levelWarn := params&LEVEL_WARN != 0
	levelError := params&LEVEL_ERROR != 0
	levelFatal := params&LEVEL_FATAL != 0
	srcFile := params&PRINT_SRC_FILE != 0
	result := &Console{
		Debug: func(format string, a ...any) {},
		Info:  func(format string, a ...any) {},
		Warn:  func(format string, a ...any) {},
		Error: func(format string, a ...any) {},
		Fatal: func(format string, a ...any) {},
	}
	if levelDebug {
		result.Debug = result.debugFunc
	}
	if levelInfo {
		result.Info = result.infoFunc
	}
	if levelWarn {
		result.Warn = result.warnFunc
	}
	if levelError {
		result.Error = result.errorFunc
	}
	if levelFatal {
		result.Fatal = result.fatalFunc
	}
	if srcFile {
		printSrcFileEmptyFunc = printSrcFileFunc
	}
	return result
}

// Log 打印日志的函数
func output(level int, msg string) {
	// 格式化日志等级字符串,添加颜色
	levelStr := generateLevel(level)
	now := generateNowTime()
	printSrcFileEmptyFunc()
	fmt.Printf("%s |%s| %s\n", now, levelStr, msg)
}

// debugFunc 打印DEBUG等级的日志
func (c *Console) debugFunc(format string, a ...any) {
	msg := fmt.Sprintf(format, a...)
	output(LEVEL_DEBUG, msg)
}

// infoFunc 打印INFO等级的日志
func (c *Console) infoFunc(format string, a ...any) {
	msg := fmt.Sprintf(format, a...)
	output(LEVEL_INFO, msg)
}

// warningFunc 打印WARNING等级的日志
func (c *Console) warnFunc(format string, a ...any) {
	msg := fmt.Sprintf(format, a...)
	output(LEVEL_WARN, msg)
}

// errorFunc 打印ERROR等级的日志
func (c *Console) errorFunc(format string, a ...any) {
	msg := fmt.Sprintf(format, a...)
	output(LEVEL_ERROR, msg)
}

// fatalFunc 打印FATAL等级的日志
func (c *Console) fatalFunc(format string, a ...any) {
	msg := fmt.Sprintf(format, a...)
	output(LEVEL_FATAL, msg)
}

func printSrcFileFunc() {
	_, file, line, ok := runtime.Caller(3) // 注意这里要改为3,因为调用堆栈深入了一层(此处根据实际情况修改数值)
	if !ok {
		log.Println("无法获取调用者信息")
		return
	}
	fileStr := fmt.Sprintf("\033[1;95m%s:%d\033[0m", file, line)
	// 打印格式化的日志
	fmt.Printf("%s\n", fileStr)
}

func generateNowTime() string {
	return time.Now().Format("2006-01-02 - 15:04:05.000")
}

func generateLevel(level int) string {
	// logColor 用于根据日志等级设置背景色和文字色
	logColor := map[int]string{
		LEVEL_DEBUG: fmt.Sprintf("\033[44;97m%-5s\033[0m", "DEBUG"),  //
		LEVEL_INFO:  fmt.Sprintf("\033[102;97m%-5s\033[0m", "INFO"),  //
		LEVEL_WARN:  fmt.Sprintf("\033[103;97m%-5s\033[0m", "WARN"),  //
		LEVEL_ERROR: fmt.Sprintf("\033[101;97m%-5s\033[0m", "ERROR"), //
		LEVEL_FATAL: fmt.Sprintf("\033[41;97m%-5s\033[0m", "FATAL"),  //
	}
	return fmt.Sprintf(logColor[level])
}

调用方法:

func main() {
	c := NewConsole(31)
	c.Error("test error")
	c.Info("test info")
	c.Debug("test debug")
}

当传入31时效果如下:

当传入63时效果如下:

下面是打印日志等级组合的数值:

标签:封装,31,Golang,test,Go,控制台
From: https://www.cnblogs.com/biltong/p/18230582

相关文章

  • 【Go专家编程——定时器】
    定时器定时器在Go语言开发中被广泛使用,准确掌握其用法和实现原理至关重要Go语言提供了两种定时器一次性定时器Timer:定时器只计时一次,计时结束便停止运行周期性定时器Ticker:定时器周期性地进行计时,除非主动停止,否则将永久运行。1一次性定时器Timer1.1简介Timer是一种......
  • Django使用正则表达式
    本书1-7章样章及配套资源下载链接:https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwd=nanc 源码、PPT课件、教学视频等,可以从前言给出的下载信息下载,大家可以评估一下。在Django框架的新版本(v2.0+)中,URLconf模块虽然更改了配置方式,但它依然可以对老版本进行兼容,兼容的......
  • python基于flask的羽毛球场地管理系统django
    该系统分为用户的预约场地前台、管理员的系统管理后台两部分。预约场地前台功能模块:登录、注册、修改密码、选择时间、选择场地、支付费用、生成支付凭证等。系统管理后台功能模块:场地的增删查改,完善用户信息数据,统计场地信息,管理用户等。整个系统各个模块的具体功能有:预约......
  • 用 cgo 处理信号,go 不能处理信号
    下面是我的main.gopackagemain/*#include<stdio.h>;#include<signal.h>;#include<string.h>;#include<stdlib.h>;#include<unistd.h>;//用于存储旧操作的全局变量structsigactionold_action;//信号处理函数voidhandler(intsignum,siginf......
  • Django + Vue 使用Nginx + uWsgi部署
    1.settings.py配置STATIC_ROOT=os.path.join(BASE_DIR,'static/dist')#导入前后端静态资源后更改即可DEBUG=True#为True不容易暴露项目信息,当然也不显示BUG信息ALLOWED_HOSTS=['*']STATIC_URL='/static/' 2.django端打包静态资源#会在static下生成[root@dsc1m......
  • PEnum_DistributionSystemElectricalCategory
    PEnum_DistributionSystemElectricalCategory  TypevaluesTypeDescriptionEXTRALOWVOLTAGENodescriptionavailable.HIGHVOLTAGENodescriptionavailable.LOWVOLTAGENodescriptionavailable.OTHERrequiredcategorynotonscaleNOTKN......
  • arcpy获取polygon内环
    当使用arcpy获取polygon几何的时候,不能像ao一样获取到内外环,只能获取到单个部件。而part返回的即是一个点组了。所以只能通过None对象进行分割,确定部件内的内外环。一个part内,只有一个外环,可以有多个内环。所以格式即为[ exteriorringpoint0, ..., exteriorringpointn, ......
  • 使用 Helmfile 插件进行 Argo CD 部署 - 未找到卷挂载
    我正试图在我的Rancherkubernetes集群中使用Helmfile插件设置ArgoCD部署,并遵循此参考文档。但是,我遇到了找不到卷挂载的问题。以下是我的设置细节:<代码Deployment.yaml:apiVersion:apps/v1类型:部署元数据:名称:argocd-repo-server命名空间:argocdspec:tem......
  • 生成式人工智能课程(1)——Goolge云生成式人工智能课程
    Google提供了两个生成式人工智能课程学习路径,官方称为LearningPath。地址为:分别是面向所有人的生成式人工智能入门(Beginner:IntroductiontoGenerativeAI),和面向开发者的人工智能(Advanced:GenerativeAIforDevelopers)1、生成式人工智能入门(Beginner:Introductiont......
  • 简单免杀绕过和利用上线的GoCS
    前言Goby可以快速准确的扫描资产,并直观呈现出来。同时经过上次EXP计划过后,PoC&EXP也增加了许多。在实战化漏洞扫描后,对于高危漏洞的利用,不仅仅只在whoami上,而是要进入后渗透阶段,那么对于Windows机器而言,上线CS是必不可少的操作,会让后渗透如鱼得水。此插件只运用了简......