【Go】全局日志处理、按天生成日志文件、格式化日志输出

前言

最近在学fiber框架,关于日志处理我纠结了好长一段时间,我一直在纠结到底怎么样才能像 logback-spring.xml 实现同样的日志处理。。。怪我自己思维定势了,老是用Java的思维想去实现。

实现

全局日志

全局错误日志,用中间件来处理,有error错误,就将错误信息格式化输出到控制台,同时输出到文件。

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"go-web1/log"
	"go-web1/sys/controller"
	"go-web1/sys/model"
	"net"
	"net/http"
	"os"
	"strings"
	"time"
)

func main() {
	app := fiber.New()
	// 中间件
	app.Use(Logger())   // 使用日志中间件
	app.Listen(fmt.Sprintf(":%d", 8080))
}

// 统一的日志格式化输出中间件
func Logger() fiber.Handler {
	return func(c *fiber.Ctx) error {
		start := time.Now()
		// 处理请求
		err := c.Next()
		var logMessage string
		if err != nil {
			// 记录日志
			logMessage = fmt.Sprintf("[%s] %s %s - %s ==> [Error] %s\n", start.Format("2006-01-02 15:04:05"), c.Method(), c.Path(), time.Since(start), err.Error())
		} else {
			// 记录日志
			logMessage = fmt.Sprintf("[%s] %s %s - %s\n", start.Format("2006-01-02 15:04:05"), c.Method(), c.Path(), time.Since(start))
		}
		// 输出到控制台
		fmt.Print(logMessage)
		// 输出到文件
		filename := "logs/" + time.Now().Format("2006-01-02") + ".log"
		file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
		if err != nil {
			log.Error("日志文件的打开错误 : " + err.Error())
			return err
		}
		defer file.Close()
		if _, err := file.WriteString(logMessage); err != nil {
			log.Error("写入日志文件错误 : " + err.Error())
		}
		return err
	}
}

// ......省略其他代码

自定义格式化日志输出

全局日志输出,输出的日志都是api层的日志信息,有的时候我们在其他地方也需要打印日志信息,并且把它们也输出到文件中,并且日志的格式要和全局日志的输出格式一致。

我们先在项目根目录建一个 log 文件夹,里面建一个 log.go 文件,在这里实现自定义日志输出

在这里插入图片描述

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

func Info(msg string) {
	logOut(msg, "Info")
}

func Debug(msg string) {
	logOut(msg, "Debug")
}

func Error(msg string) {
	logOut(msg, "Error")
}

// 日志格式化输出
func logOut(msg string, level string) {
	start := time.Now()
	// 获取调用的文件和行号
	_, file, line, _ := runtime.Caller(2)
	file = filepath.Base(file)
	// 使用日志包记录日志,并包括级别、文件名和行号
	logMsg := fmt.Sprintf("[%s] - %s ==> [%s:%d] [%s] %s\n",
		start.Format("2006-01-02 15:04:05"),
		time.Since(start),
		file,
		line,
		level,
		msg,
	)
	fmt.Print(logMsg)  // 打印到控制台
	logOutFile(logMsg) // 输出到文件
}

// 日志输出到文件
func logOutFile(msg string) {
	// 输出到文件
	filename := "logs/" + time.Now().Format("2006-01-02") + ".log"
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("日志文件的打开错误 :", err)
	}
	defer file.Close()
	if _, err := file.WriteString(msg); err != nil {
		fmt.Println("写入日志文件错误 :", err)
	}
}

使用

// 在获取公钥的接口,输出错误日志
// 获取公钥
func GetKey(c *fiber.Ctx) error {
	err := errors.New("全局日志输出:获取公钥错误")
	log.Info("自定义日志输出:获取公钥错误")
	log.Debug("自定义日志输出:获取公钥错误")
	log.Error("自定义日志输出:获取公钥错误")
	//return c.Status(200).JSON(config.Success(util.GetPublicKey()))
	return err
}

输出

控制台

[2023-09-15 16:13:06] - 11.3557ms ==> [login_controller.go:15] [Info] 自定义日志输出:获取公钥错误
[2023-09-15 16:13:06] - 0s ==> [login_controller.go:16] [Debug] 自定义日志输出:获取公钥错误
[2023-09-15 16:13:06] - 55.5µs ==> [login_controller.go:17] [Error] 自定义日志输出:获取公钥错误
[2023-09-15 16:13:06] GET /sys/getKey - 12.5681ms ==> [Error] 全局日志输出:获取公钥错误

日志文件

[2023-09-15 16:13:06] - 11.3557ms ==> [login_controller.go:15] [Info] 自定义日志输出:获取公钥错误
[2023-09-15 16:13:06] - 0s ==> [login_controller.go:16] [Debug] 自定义日志输出:获取公钥错误
[2023-09-15 16:13:06] - 55.5µs ==> [login_controller.go:17] [Error] 自定义日志输出:获取公钥错误
[2023-09-15 16:13:06] GET /sys/getKey - 12.5681ms ==> [Error] 全局日志输出:获取公钥错误

可以看到,控制台和日志文件输出的是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值