2023年11月29日发(作者:)

golang:实现⼀个简单的⽇志库⽇志信息按⽇期切割存放在⽂件中

1、定义⽇志级别

const (

DEBUG=iota

TRACE

INFO

WARNING

ERROR

FATAL

)

2、定义log接⼝

// log

定义接⼝

type Log interface {

Debug(msg string)

TRACE(msg string)

INFO(msg string)

WARNING(msg string)

ERROR(msg string)

FATAL(msg string)

}

输出⽅式⼀:将⽇志记录在控制台

实现log接⼝中的⽅法。

1、根据调⽤的级别输出,将⽇志级别(int)转为string类型,例如(int)实际值为0,转为(string)

DEBUG"DEBUG"

2、在控制台输⼊,输⼊的时候带上⽇期

import (

"fmt"

"runtime"

"time"

)

//

当前⽇志级别

type Logger struct {

Level int8

}

//

构造⽅法

func NewLogger(level int8) Logger {

return Logger{Level: level,}

}

//

设置当前⽇志级别

func (this *Logger)SetLogger(level int8) {

this.Level=level

}

// Log

实现接⼝中的⽅法

func (this Logger)Debug(msg string) {

this.printLog(DEBUG,msg)

}

func (this Logger)TRACE(msg string) {

this.printLog(TRACE,msg)

}

func (this Logger)INFO(msg string) {

this.printLog(INFO,msg)

}

func (this Logger)WARNING(msg string) {

this.printLog(WARNING,msg)

}

func (this Logger)ERROR(msg string) {

this.printLog(ERROR,msg)

}

func (this Logger)FATAL(msg string) {

this.printLog(FATAL,msg)

}

//

根据⽇志级别输出⽇志信息:⽇志输出到控制台

func (this Logger)printLog(level int8,msg string) {

var l string

switch level {

case DEBUG:l="DEBUG"

case TRACE:l="TRACE"

case INFO:l="INFO"

case WARNING:l="WARNING"

case ERROR:l="ERROR"

case FATAL:l="FATAL"

}

//

当前级别⼤于⽇志级别才输出否则不输出

if level >= this.Level {

_, file, line, ok := runtime.Caller(2)

if !ok {

fmt.Printf("[%s] [%s] [%s:%d] %sn",time.Now().Format("2006-01-02 15:04:05"),"ERROR",file,line,"() fail")

return

}

//

⽇志信息输出到控制台

fmt.Printf("[%s] [%s] [%s:%d] %sn",time.Now().Format("2006-01-02 15:04:05"),l,file,line,msg)

}

}

测试代码:

import (

"helloworld/exercise/logger"

"time"

)

func main() {

my:=logger.Logger{}

my.Level=logger.TRACE //

设置⽇志级别

for{

my.Debug("这是⼀条Debug信息")

time.Sleep(time.Second)

my.TRACE("这是⼀条Trace信息")

time.Sleep(time.Second)

my.INFO("这是⼀条Info信息")

time.Sleep(time.Second)

my.WARNING("这是⼀条Warning信息")

time.Sleep(time.Second)

my.ERROR("这是⼀条Error信息")

time.Sleep(time.Second)

my.FATAL("这是⼀条Fatal信息")

time.Sleep(time.Second)

}

}

运⾏结果:由于设置了⽇志级别,因此Debug级别⽇志没有输出。

输出⽅式⼆:将⽇志记录在⽂件中 ⽂件按⽇期区分

实现接⼝中定义的⽅法。

1、创建⽇志结构体的时候,需要指定⽇志存放路径

2、创建⽇志⽂件,命名格式,例如20210907,⽇志同⼀天的存放在⼀个⽂件中

年⽉⽇

3、向⽇志中写⼊内容的时候,判断当前⽇志⽂件是否需要更新(是否是新的⼀天)

4、当前⽇志等级是否需要记录该⽇志,例如当前⽇志级别是,那么之前等级如TRACE的都不需要记录。

ERROR

5、将⽇志写进⽂件中

import (

"fmt"

"os"

"path"

"runtime"

"time"

)

//

按照⽇期存储⽇志信息

type Logger2 struct {

level int8 //

打印⽇志级别

level int8 //

打印⽇志级别

path string //

⽂件存储路径

filename string //

⽂件名称

file *os.File //

⽂件指针

time *time.Time //

⽂件⽇期

}

//

构造⽅法

func NewLogger2(path string) Logger2{

l:=Logger2{path: path}

l.newLogFile()

return l

}

//

设置⽇志级别

func (this *Logger2)SetLevel(level int8) {

this.level=level

}

//

设置⽇志⽂件路径

func (this *Logger2)SetPath(path string) {

this.path=path

}

//

向⽇志中追加内容

func (this *Logger2)writeToLog(level int8,msg string) {

// Logger

当前⽇志⽂件已过期,需要⽤新的⽇志⽂件记录,更新信息

if !this.isOneDay() {

this=this.newLogFile()

}

var l string

switch level {

case DEBUG:l="DEBUG"

case TRACE:l="TRACE"

case INFO:l="INFO"

case WARNING:l="WARNING"

case ERROR:l="ERROR"

case FATAL:l="FATAL"

}

//

当前级别⼤于⽇志级别才输出否则不输出

if level >= this.level {

_, file, line, ok := runtime.Caller(2)

if !ok {

fmt.Fprintln(this.file,"[",time.Now().Format("2006-01-02 15:04:05"),"]","[ERROR]","[",file,":",line,"]","() fail")

return

}

//

⽇志信息写⼊⽂件中

fmt.Fprintln(this.file,"[",time.Now().Format("2006-01-02 15:04:05"),"]","[",l,"]","[",file,":",line,"]",msg)

}

}

// Log

实现接⼝中的⽅法

func (this Logger2)Debug(msg string) {

this.writeToLog(DEBUG,msg)

}

func (this Logger2)TRACE(msg string) {

this.writeToLog(TRACE,msg)

}

func (this Logger2)INFO(msg string) {

this.writeToLog(INFO,msg)

}

func (this Logger2)WARNING(msg string) {

this.writeToLog(WARNING,msg)

}

func (this Logger2)ERROR(msg string) {

this.writeToLog(ERROR,msg)

this.writeToLog(ERROR,msg)

}

func (this Logger2)FATAL(msg string) {

this.writeToLog(FATAL,msg)

}

// time

判断当前是否是同⼀天

func (this Logger2) isOneDay() bool {

now := time.Now()

day := this.time

//

⽐较年⽉⽇是否相同

return now.Day()==day.Day() && now.Month()==day.Month() && now.Year()==day.Year()

}

//

若当前是新的⼀天,则需要创建新⽂件,同时更新⽂件信息

func (this *Logger2) newLogFile() *Logger2 {

//

获取当前⽇期

now:=time.Now()

filename:=now.Format("20060102")+".log"

//

获取⽇志路径

road := this.path

newPath := path.Join(road, filename)

//

创建新的⽂件以当前年⽉⽇命名

file, err := os.OpenFile(newPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)

if err != nil {

// err

作为⽇志输出在⽂件中

_, f, line, _ := runtime.Caller(0)

fmt.Fprintln(this.file,"[",time.Now().Format("2006-01-02 15:04:05"),"]","[ERROR]","[",f,":",line,"]","create log file failed!")

return this

}

//

更新结构体数据

this.filename=filename

this.file=file

this.time=&now

return this

}

测试代码:

import (

"helloworld/exercise/logger"

"os"

"path"

"time"

)

func main() {

getwd, _ := os.Getwd() //

设置⽂件存储路径在当前⼯作⽬录下

newPath := path.Join(getwd,"./exercise/logger/logFile")

my := logger.NewLogger2(newPath)

my.SetLevel(2) //

设置⽇志记录级别

for{

my.Debug("这是⼀条Debug信息")

time.Sleep(time.Second)

my.TRACE("这是⼀条Trace信息")

time.Sleep(time.Second)

my.INFO("这是⼀条Info信息")

time.Sleep(time.Second)

my.WARNING("这是⼀条Warning信息")

time.Sleep(time.Second)

my.ERROR("这是⼀条Error信息")

time.Sleep(time.Second)

my.FATAL("这是⼀条Fatal信息")

time.Sleep(time.Second)

}

}

运⾏结果: