golang简单易用的日志系统插件structy/log支持调试和消息分级

structy/log - Golang简单易用的日志系统插件

structy/log 是一个简单易用的日志系统,虽然简约但提供了调试和消息分级的功能。

功能特点

  • 支持调试模式开关
  • 提供不同级别的日志输出
  • 简洁易用的API设计

示例代码

下面是一个完整的示例demo,展示如何使用structy/log进行日志记录:

package main

import (
    "fmt"
    "github.com/structy/log"
)

func main() {
    // 调试模式下会显示Debug日志
    log.Debugln("Debug message")

    // 关闭调试模式
    log.DebugMode = false
    log.Debugln("Debug message that will be hidden") // 这行不会显示

    // 不同级别的日志输出
    log.Println("Info message")          // 普通信息
    log.Warningln("Warning message")     // 警告信息
    log.Errorln("Error message")         // 错误信息
    log.Fatal("Fatal error message")     // 致命错误,会终止程序
    fmt.Println("I will never be printed because of Fatal()") // 这行不会执行
}

日志级别说明

  1. Debugln: 调试信息,仅在DebugMode=true时显示
  2. Println: 普通信息,始终显示
  3. Warningln: 警告信息,始终显示
  4. Errorln: 错误信息,始终显示
  5. Fatal: 致命错误,打印后调用os.Exit(1)终止程序

使用建议

  • 开发阶段可以开启DebugMode=true查看调试信息
  • 生产环境建议关闭DebugMode=false
  • 根据消息重要性选择合适的日志级别

这个日志系统非常适合需要简单日志功能但又不希望引入复杂日志框架的项目。


更多关于golang简单易用的日志系统插件structy/log支持调试和消息分级的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单易用的日志系统插件structy/log支持调试和消息分级的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


structy/log - 一个简单易用的Go日志系统

structy/log 是一个轻量级的Go语言日志库,提供了简单的日志分级和调试功能。下面我将介绍它的基本用法和实现示例。

基本特性

  1. 支持多种日志级别:DEBUG, INFO, WARN, ERROR
  2. 简单的API设计
  3. 可配置的输出格式
  4. 轻量级无外部依赖

安装

go get github.com/structy/log

基本用法示例

package main

import (
	"github.com/structy/log"
)

func main() {
	// 初始化日志器
	logger := log.NewLogger(log.DEBUG) // 设置最低日志级别为DEBUG

	// 记录不同级别的日志
	logger.Debug("这是一条调试信息")
	logger.Info("这是一条普通信息")
	logger.Warn("这是一条警告信息")
	logger.Error("这是一条错误信息")

	// 带格式化输出
	logger.Infof("用户 %s 登录成功,尝试次数: %d", "Alice", 3)
	
	// 带字段的日志
	logger.WithFields(log.Fields{
		"user": "Bob",
		"ip":   "192.168.1.1",
	}).Warn("检测到异常登录尝试")
}

自定义实现

如果你想自己实现一个类似的简单日志系统,可以参考以下代码:

package simplelog

import (
	"fmt"
	"io"
	"os"
	"sync"
	"time"
)

// 日志级别类型
type Level int

const (
	DEBUG Level = iota
	INFO
	WARN
	ERROR
)

var levelNames = []string{
	"DEBUG",
	"INFO",
	"WARN",
	"ERROR",
}

// Logger 日志器结构体
type Logger struct {
	mu     sync.Mutex
	level  Level
	output io.Writer
}

// NewLogger 创建一个新的日志器
func NewLogger(level Level) *Logger {
	return &Logger{
		level:  level,
		output: os.Stdout,
	}
}

// SetOutput 设置输出目标
func (l *Logger) SetOutput(w io.Writer) {
	l.mu.Lock()
	defer l.mu.Unlock()
	l.output = w
}

// log 内部日志方法
func (l *Logger) log(level Level, msg string) {
	if level < l.level {
		return
	}

	timestamp := time.Now().Format("2006-01-02 15:04:05")
	logMsg := fmt.Sprintf("[%s] %s %s\n", timestamp, levelNames[level], msg)

	l.mu.Lock()
	defer l.mu.Unlock()
	_, _ = fmt.Fprint(l.output, logMsg)
}

// Debug 记录调试信息
func (l *Logger) Debug(msg string) {
	l.log(DEBUG, msg)
}

// Info 记录普通信息
func (l *Logger) Info(msg string) {
	l.log(INFO, msg)
}

// Warn 记录警告信息
func (l *Logger) Warn(msg string) {
	l.log(WARN, msg)
}

// Error 记录错误信息
func (l *Logger) Error(msg string) {
	l.log(ERROR, msg)
}

// Debugf 格式化调试信息
func (l *Logger) Debugf(format string, args ...interface{}) {
	l.log(DEBUG, fmt.Sprintf(format, args...))
}

// Infof 格式化普通信息
func (l *Logger) Infof(format string, args ...interface{}) {
	l.log(INFO, fmt.Sprintf(format, args...))
}

// Warnf 格式化警告信息
func (l *Logger) Warnf(format string, args ...interface{}) {
	l.log(WARN, fmt.Sprintf(format, args...))
}

// Errorf 格式化错误信息
func (l *Logger) Errorf(format string, args ...interface{}) {
	l.log(ERROR, fmt.Sprintf(format, args...))
}

高级用法

structy/log 还支持一些高级功能:

  1. 设置输出目标
file, _ := os.Create("app.log")
logger.SetOutput(file)
  1. JSON格式输出
logger.SetFormatter(log.JSONFormatter)
  1. 添加自定义字段
logger.WithField("request_id", "abc123").Info("处理请求")

性能考虑

对于高性能场景,可以考虑以下优化:

  1. 使用缓冲IO
  2. 异步写入日志
  3. 避免频繁的字符串拼接

总结

structy/log 是一个简单实用的Go日志库,适合中小型项目使用。它提供了基本的日志分级功能,API设计简洁明了。对于更复杂的需求,可以考虑zerolog或zap等更成熟的日志库。

如果你需要更复杂的功能如日志轮转、远程日志等,可以基于这个简单实现进行扩展,或者考虑集成其他专门的日志处理库。

回到顶部