前言

大家如果使用过 Java 语言进行开发,就应该多少会用到 Log4j 系列日志组件工具,其格式化的输出方式深受大家喜欢,支持info,debug,error等分类打印,支持控制台、文件、以及利用 Log4j2 还能实现分布式日志收集等,对于后期维护、问题定位,提供了很好的支撑能力。 

Golang作为新兴语言,自然还没有像成熟的 Java 这么多的开源工具,但我想在 Golang 中也使用到像 Log4j 这样的组件,所以自己手动写了个简单版,先在自己项目中凑合着用着,可前往个人博客地址查看:http://xlyzane.cn/blog/article/11​​​​​​​

基本功能如下:

    1、实现了基本的格式化输出

    2、支持多种日志级别打印

    3、可输出到控制台、文件

    4、按日期创建日志文件

 

效果图

1、控制台

2、文件

源码分析

1、初始化

    参数说明:

        logDir:日志文件存放文件夹目录

        logPrefix:日志文件的前缀,如log

        logSuffix:日志文件的后缀,如.log

        isLogConsole:是否打印至控制台,为true时,会同时打印到文件和控制台

func Init(logDir , logPrefix , logSuffix string, isLogConsole bool) {
	if len(logDir)==0 || len(logPrefix)==0 || len(logSuffix)==0 {
		logDIR = DEFAULT_DIR
		logPREFIX = DEFAULT_PREFIX
		logSUFFIX = DEFAULT_SUFFIX
	} else {
		logDIR = logDir
		logPREFIX = logPrefix
		logSUFFIX = logSuffix
	}

	logConsole = isLogConsole

	// check log dir
	dir,_ := os.Open(logDir)
	if dir == nil {
		err := os.MkdirAll(logDir, os.ModePerm)
		if err != nil {
			fmt.Println(err)
		}
	}

	logFile := logDir + logPrefix + time.Now().Format("2006-01-02") + logSuffix
	target := getLogFile(logFile)

	logger = log.New(target, INFO_LOG_PREFIX, 0)
	logger.SetFlags(log.Ldate | log.Ltime)

	go process()
	INFO("Init logger success ...")
}

 

2、记录日志

    参数说明:

        value:需要打印的日志内容

    其他说明:

        需要打印的日志通过 LogMessage 结构体封装,传给 logChan 通道处理打印,生产者消费者模式,这样可单线程,也可多线程打印日志

/**
 info log
 */
func INFO(value interface{}) {
	_,file,line,_ := runtime.Caller(1)
	var logMsg LogMessage
	logMsg.message = value
	logMsg.file = file
	logMsg.line = line
	logMsg.msgType = INFO_LOG_PREFIX
	logChan <- logMsg
}

func process() {
	for{
		message, ok := <- logChan
		if !ok {
			continue
		}

		//
		checkLoggerUpdate()

		logger.SetPrefix(message.msgType)
		logger.Printf(" %s:%d %s",message.file, message.line, message.message)
		if logConsole {
			outputToConsole(message.msgType, message.file, message.line, message.message)
		}
	}
}

func outputToConsole(levelPrefix string, file string, line int, value interface{}) {
	fmt.Printf("%s %s %s:%d %sn", levelPrefix, time.Now().Format("2006-01-02 15:04:05"),
		file, line, value)
}

 

后文

这只是一个比较简单的打印日志工具的实现,功能简易,对于要求不高的日志收集足以够用了,性能方面暂时未测试,不过代码如此简易,相信也差不多哪儿去,后面有时间会再根据实际情况进行优化。

如果大家想要全部代码的话,可以留言,我再更新出来,希望这个能对大家有用,大佬勿喷,谢谢!