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参数用于控制是否打印到控制台上