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)
}
}
运⾏结果:


发布评论