go封装的日志工具

package logger

import (
	"fmt"
	"io"
	"log"
	"os"
	"runtime"
	"time"
)

var logger *log.Logger

type LogMessage struct {
	file    string
	line    int
	message interface{}
	msgType string
}

const (
	DEFAULT_DIR     string = "log/"
	DEFAULT_PREFIX         = "wuhu_blog"
	DEFAULT_SUFFIX         = ".log"
	INFO_LOG_PREFIX        = "[INFO]"
	Fatal_LOG_PREFIX        = "[FATAL]"
	Panic_LOG_PREFIX        = "[PANIC]"
)

var (
	logDIR     string
	logPREFIX  string
	logSUFFIX  string
	logConsole bool
	logChan = make(chan LogMessage)
)

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 ...")
}
func getLogFile(logFile string) io.Writer {
	file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		panic("Create log file error")
	}
	return file
}

/**
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
}
/**
fatal log
*/

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

func Panic(value interface{}) {
	_, file, line, _ := runtime.Caller(1)
	var logMsg LogMessage
	logMsg.message = value
	logMsg.file = file
	logMsg.line = line
	logMsg.msgType = Panic_LOG_PREFIX
	logChan <- logMsg
}
func process() {
	for {
		message, ok := <-logChan
		if !ok {
			continue
		}
		logger.SetPrefix(message.msgType)
		if logConsole {
			outputToConsole(message.msgType, message.file, message.line, message.message)
		}
		switch message.msgType {
			case INFO_LOG_PREFIX:
				logger.Printf(" %s:%d %s", message.file, message.line, message.message)
			case Fatal_LOG_PREFIX:
				logger.Fatalf(" %s:%d %s", message.file, message.line, message.message)
			case Panic_LOG_PREFIX:
				logger.Panicf(" %s:%d %s", message.file, message.line, message.message)
		}
	}
}

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

调用Init函数初始化就可以使用了,isLogConsole参数用于控制是否打印到控制台上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值