Go语言类似log4j日志帮助类

环境:编写go语言需要按天记录打印日志,类似log4j这种帮助类,在网上参考别人的文章

实现:

帮助类:

package utils

import (
	"fmt"
	"os"
	"path"
	"runtime"
	"time"
)

const (
	DEBUG = iota
	TRACE
	INFO
	WARNING
	ERROR
	FATAL
)

// 按照日期存储日志信息
type Logger2 struct {
	level    int8       // 打印日志级别
	path     string     // 文件存储路径
	filename string     // 文件名称
	file     *os.File   //文件指针
	time     *time.Time // 文件日期
}

// 构造方法
func Logger(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, "]", "runtime.Caller() 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)
}
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
}

func main() {

	getwd, _ := os.Getwd() // 设置文件存储路径在当前工作目录下
	log := utils.Logger(getwd + "/log")
	log.SetLevel(2) // 设置日志记录级别

	// 堵塞进程
	wait := make(chan int, 1)
	<-wait
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值