目錄結構
| - myLog
| - mylog.go
| - file_log.go
| - 項目目錄
| - main.go
日誌庫文件
package mylog
import (
"path"
"runtime"
)
const (
DEBUG = iota
TRACE
INFO
WARNING
ERROR
CRITICAL
)
func getCallerInfo() (fileName, funcName string, line int) {
pc, fileName, line, ok := runtime.Caller(3)
if !ok {
return
}
fileName = path.Base(fileName)
funcName = path.Base(runtime.FuncForPC(pc).Name())
return fileName, funcName, line
}
package mylog
import (
"fmt"
"os"
"time"
)
type FileLogger struct {
level int
logFilePath string
logFileName string
logFile *os.File
}
func NewFileLogger(level int, logFilePath, logFileName string) *FileLogger {
flObj := &FileLogger{
level: level,
logFilePath: logFilePath,
logFileName: logFileName,
}
flObj.initFileLogger()
return flObj
}
func (f *FileLogger) initFileLogger() {
fPath := fmt.Sprintf("%s%s", f.logFilePath, f.logFileName)
file, err := os.OpenFile(fPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
panic(fmt.Sprintf("open file %v failed\n", fPath))
}
f.logFile = file
}
func (f *FileLogger) logHandle(msg, loglevel string, args ...interface{}) {
fileName, funcName, line := getCallerInfo()
nowStr := time.Now().Format("[2006-01-02 15:04:05.000]")
logMsg := fmt.Sprintf("%s [%s] [%s:%s %d] %s\n", nowStr, loglevel, fileName, funcName, line, msg)
logMsg = fmt.Sprintf(logMsg, args...)
fmt.Println(logMsg)
f.logFile.WriteString(logMsg)
}
func (f *FileLogger) DEBUG(msg string, args ...interface{}) {
if f.level > DEBUG {
return
}
f.logHandle(msg, "DEBUG", args...)
}
func (f *FileLogger) TRACE(msg string, args ...interface{}) {
if f.level > TRACE {
return
}
f.logHandle(msg, "TRACE", args...)
}
func (f *FileLogger) INFO(msg string, args ...interface{}) {
if f.level > INFO {
return
}
f.logHandle(msg, "INFO", args...)
}
func (f *FileLogger) WARNING(msg string, args ...interface{}) {
if f.level > WARNING {
return
}
f.logHandle(msg, "WARNING", args...)
}
func (f *FileLogger) ERROR(msg string, args ...interface{}) {
if f.level > ERROR {
return
}
f.logHandle(msg, "ERROR", args...)
}
func (f *FileLogger) CRITICAL(msg string, args ...interface{}) {
if f.level > CRITICAL {
return
}
f.logHandle(msg, "CRITICAL", args...)
}
調用文件
package main
import mylog "code.oldboy.com/day04/14myLog"
const (
LogLevel = mylog.DEBUG
LogPath = "./"
LogName = "xx.log"
)
func main() {
fl := mylog.NewFileLogger(LogLevel, LogPath, LogName)
fl.DEBUG("代碼已經執行")
fl.INFO("id11用戶登錄")
fl.CRITICAL("程序報錯, 錯誤碼爲%d", 131231)
fl.ERROR("id爲10的用戶一直在嘗試登錄")
}