go语言的日志记录实现---提高篇

目录

1、基础篇

2、提高篇---增加日志文件名设置

3、提高篇---增加 文件 打开参数以及perm设置

4、提高篇----支持日志记录模式设置

5、提高篇---支持修改日志打印级别

6、函数调用


1、基础篇

go语言的日志记录实现---基础篇_log_level_butt-CSDN博客

2、提高篇---增加日志文件名设置

var logFilePath = ""
var logFileName = "./serverlog.log"
var logFile = ""

//设置日志文件信息 默认是./serverlog.log
func LogSetLogFile(file string) {
	logFile = file
}

//设置日志文件路径
func LogSetLogFilePath(filepath string) {
	logFilePath = filepath
}

//设置日志文件名称
func LogSetLogFileName(filename string){
	logFileName = filename
}

func getLogFile() string{
	if "" !=logFile {
		return logFile
	}

	return  logFilePath+logFileName
}

增加上面的代码,然后将原来的写日志地方改成 

WriteWithGolog(getLogFile(),strLog)

调用的时候通过如下 方式设置日志文件

Debug.LogSetLogFile("./log/log.log")

如果日志文件比较多的话,可以通过 如下设置路径

Debug.LogSetLogFilePath("/var/log/")

然后各个其他地方写日志或者 初始化到时候,调用 

Debug.LogSetLogFileName("testlog.log")

设置日志文件名称。因为是全局的,所以LogSetLogFilePath调用一次就可以。

3、提高篇---增加 文件 打开参数以及perm设置

var osFlag = 0
var osPerm os.FileMode = 0

//设置文件打开参数,默认是os.O_RDWR|os.O_CREATE|os.O_APPEND,读写,创建,增量写
func LogSetOsFlag(flag int) {
	osFlag = flag
}

func getOsFlag()  int {
	if 0 != osFlag {
		return osFlag
	}
	return os.O_RDWR|os.O_CREATE|os.O_APPEND
}

//设置 FileMode,默认是0644
func LogSetOsPerm(perm os.FileMode) {
	osPerm = perm
}

func getOsPerm() os.FileMode {
	if 0 != osPerm {
		return osPerm
	}

	return 0644
}

如图,定义两个全局的参数,通过接口调用去设置值。

默认文件的参数是,允许读写,没有文件的时候创建,以及 增量写文件。

增加之后,需要修改写文件的函数:

//写日志文件
func WriteWithGolog(filename,content string) {
	f, err := os.OpenFile(filename, getOsFlag(), getOsPerm())
	if err != nil {
		return
	}
	data :=[]byte(content)
	n, err := f.Write(data)
	if err == nil && n < len(data) {
		err = io.ErrShortWrite
	}
	if err1 := f.Close(); err == nil {
		err = err1
	}
	return
}

4、提高篇----支持日志记录模式设置

var logRecordMode = L_BUTT

const (
	L_NONE 	= 0x00000 //不加参数
	L_DATE 	= 0x00001  //日期
	L_LEVEL = 0x00002 //日志级别
	L_FILE 	= 0x00004 //文件名
	L_PATH 	= 0x00008 //文件路径
	L_LINE 	= 0x00010  //文件行数
	L_FUNC 	= 0x00020 //函数名
	L_ALL	= 0x00040 //全部
	L_BUTT 	= 0xfffff //非法
)

func logModeDate() string {
	logmode := getLogMode()
	if logmode&L_DATE != 0 {
		return CurrentTime()
	}
	return ""
}

func logModeLevel(level int) string {
	logmode := getLogMode()
	if logmode&L_LEVEL != 0 {
		return "\t[" + LOG_LEVEL[level] + "] "
	}
	return ""
}

func logModeFile(file string) string {
	logmode := getLogMode()
	if logmode&L_FILE != 0{
		return fmt.Sprintf("file:%s ",getFileName(file))
	}
	return ""
}

func logModePath(path string) string {
	logmode := getLogMode()
	if logmode&L_PATH != 0{
		return fmt.Sprintf("path:%s ",getFilePath(path))
	}
	return ""
}

func logModeLine(line int) string {
	logmode := getLogMode()
	if logmode&L_LINE != 0{
		return fmt.Sprintf("line:%d ",line)
	}
	return ""
}

func logModeFunc(pc uintptr) string {
	logmode := getLogMode()
	if logmode&L_FUNC != 0{
		return fmt.Sprintf("func:%s ",getFuncName(pc))
	}
	return ""
}

//设置日志打印模式
//提供的有date,level,funcname,filename,filepath,line,默认 date+level+file+line+func
func LogSetLogMode(flag int) {
	logRecordMode = flag
}

func getLogMode() int{
	if L_BUTT != logRecordMode {
		return logRecordMode
	}

	return logModeNormal
}

注意下,这里我定义的函数都是小写开头的。

在go里面,大写开头的函数,是可以被外部包调用的。

定义参数,就是类似于bit位的方法。

通过LogSetLogMode函数设置日志记录模式。

修改日志函数。

func LOG(level int, format string, a ...interface{}){
	var strLog,fmtInfo string

	//日志级别
	if logRecordLevel > level {
		return
	}
	fmtInfo = fmt.Sprintf(format,a...)

	//函数信息
	pc,filepath,line,ok := runtime.Caller(1)
	if !ok {
		strLog = logModeDate() + logModeLevel(level) + fmtInfo + "\n"
		WriteWithGolog(getLogFile(),strLog)
		return
	}

	//日志信息
	strLog = logModeDate() + logModeLevel(level) + logModePath(filepath) + logModeFile(filepath) + logModeLine(line) + logModeFunc(pc) + fmtInfo + "\n"
	WriteWithGolog(getLogFile(),strLog)
}

默认是全部支持的。当然你也可以自己设置成全部不支持,这样就只打印你 输入的信息。

5、提高篇---支持修改日志打印级别

var logRecordLevel = LOG_LEVEL_BUTT

//设置日志打印级别,默认ERR
func LogSetLogLevel(level int) {
	logRecordLevel = level
}

func getLogLevel() int{
	if LOG_LEVEL_BUTT != logRecordLevel {
		return logRecordLevel
	}

	return LOG_LEVEL_ERROR
}

默认是记录ERROR级别的日志。

6、函数调用


func test(){
	Debug.LogSetLogFile("./testlog.log")
	Debug.LogSetOsFlag(os.O_RDWR|os.O_CREATE|os.O_APPEND)
	Debug.LogSetLogMode(Debug.L_DATE|Debug.L_LEVEL|Debug.L_FILE|Debug.L_LINE|Debug.L_FUNC)
	Debug.LogSetLogLevel(LOG_INFO)
	Debug.LOG(LOG_DEBUG,"Test for file 1 debug")
	Debug.LOG(LOG_INFO,"Test for file 2 information")
	Debug.LOG(LOG_ERROR,"Test for file 3 error")
	Debug.LOG(LOG_WARNING,"Test for file 4 warning")
}
func main(){
	//Debug.LogSetLogFilePath("/var/log/")
	//Debug.LogSetLogFileName("testlog.log")
	fmt.Println("This is a Web Server test")
	//Debug.LOG_RECODE(LOG_DEBUG,"Test for file 1")
	test()
}

结果:

2019-01-13 18:46:16.178292600    [INFORMATION] file:WebServer.go line:41 func:test Test for file 2 information
2019-01-13 18:46:16.256056500    [ERROR] file:WebServer.go line:42 func:test Test for file 3 error
2019-01-13 18:46:16.257053900    [WARNING] file:WebServer.go line:43 func:test Test for file 4 warning
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Go语言可以用于实现vlmcsd,vlmcsd是一个基于KMS激活协议的开源项目,用于激活Windows操作系统和Microsoft Office套件。下面是使用Go语言实现vlmcsd的一般步骤: 1. 确定功能需求:首先需要明确vlmcsd的功能需求,包括支持的KMS激活协议版本、支持的操作系统和Office版本等。 2. 设计架构:根据功能需求,设计vlmcsd的架构,包括网络通信模块、KMS协议解析模块、激活逻辑处理模块等。 3. 实现网络通信:使用Go语言的网络编程库,如net包,实现vlmcsd与客户端之间的网络通信,包括接收客户端请求、发送响应等。 4. 解析KMS协议:根据KMS激活协议的规范,使用Go语言解析客户端发送的KMS请求,提取其中的激活信息。 5. 激活逻辑处理:根据解析得到的激活信息,使用Go语言实现相应的激活逻辑,包括生成激活密钥、验证激活密钥等。 6. 数据存储:如果需要保存激活信息或者统计数据,可以使用Go语言提供的数据库访问库,如MySQL、PostgreSQL等。 7. 错误处理和日志记录:在实现过程中,需要考虑错误处理和日志记录,使用Go语言提供的错误处理机制和日志库,如log包、logrus等。 8. 测试和调试:完成代码实现后,进行测试和调试,确保vlmcsd的功能正常。 9. 文档编和发布:编vlmcsd的使用文档,并将代码发布到适当的代码托管平台,如GitHub等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值