前言
大家如果使用过 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)
}
后文
这只是一个比较简单的打印日志工具的实现,功能简易,对于要求不高的日志收集足以够用了,性能方面暂时未测试,不过代码如此简易,相信也差不多哪儿去,后面有时间会再根据实际情况进行优化。
如果大家想要全部代码的话,可以留言,我再更新出来,希望这个能对大家有用,大佬勿喷,谢谢!