Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

FortuneW/qlog

Repository files navigation

Ask DeepWiki

qlog

一个轻量级、高性能的Go日志库,支持多种日志级别、日志轮转、控制台和文件输出等功能。

项目简介

qlog是一个专为Go应用程序设计的日志处理库,提供了简单易用且功能强大的日志记录功能。它支持多种日志级别、日志文件自动轮转、压缩、控制台和文件输出等特性,同时提供了链路追踪和性能监控功能。

快速开始

// 安装
// go get github.com/FortuneW/qlog
// 导入
import "github.com/FortuneW/qlog"
// 初始化
config := qlog.Config{
 ServiceName: "tts",
 ServerLogDir: "./logs/server",
 ManagerLogDir: "./logs/manager",
 MaxBackups: 7,
 MaxSize: 100,
 Level: "INFO",
 Compress: true,
 Rotation: "size",
 Mode: "file",
 ToConsole: true,
}
err := qlog.InitWithConfig(config)
if err != nil {
 panic(err)
}
defer qlog.UnInit()
// 获取日志记录器并记录日志
rlog := qlog.GetRLog("main")
rlog.Info("应用程序已启动")
rlog.Warn("这是一条警告信息")
rlog.Error("这是一条错误信息")

1. 整体设计

1. 整体设计

1.1 模块功能

qlog是一个轻量级日志处理模块,提供以下核心功能:

  • 支持五种日志级别(TRACE/DEBUG/INFO/WARN/ERROR)及DISABLE级别
  • 支持日志文件自动轮转和压缩
  • 支持文件和控制台两种输出模式
  • 提供三种日志记录器(RLogger/ALogger/ELogger)
  • 支持临时提升日志级别功能
  • 支持链路追踪
  • 控制台日志级别带颜色输出

1.2 核心接口

  • RLogger: 运行日志接口
    • Trace/Debug/Info/Warn/Error: 基础日志方法
    • Tracef/Debugf/Infof/Warnf/Errorf: 格式化日志方法
    • WithTraceId: 支持链路追踪
  • ALogger: 访问日志接口(用于管理接口)
    • Print: 基础打印方法
    • Printf: 格式化打印方法
  • ELogger: 子进程日志接口
    • 继承RLogger全部方法
    • GetPopELogItemChannel: 获取日志channel

2. 详细设计

2.1 日志级别管理

  • 支持级别:
    • TRACE (TRA)
    • DEBUG (DEB)
    • INFO (INF)
    • WARN (WAR)
    • ERROR (ERR)
    • DISABLE (OFF)
  • 相关方法:
    • CheckLogLevelStr: 检查日志级别有效性
    • GetLogLevelStr: 获取当前日志级别
    • SetLogLevelStr: 设置日志级别

2.2 配置管理

  • 配置项:
    • ServiceName: 服务名称
    • ServerLogDir: 服务日志目录
    • ManagerLogDir: 管理日志目录
    • MaxBackups: 最大备份数量(1-100)
    • MaxSize: 单文件最大尺寸(1-1024MB)
    • KeepDays: 日志保留天数
    • Level: 日志级别(TRA/DEB/INF/WAR/ERR/OFF)
    • Compress: 是否压缩
    • Rotation: 轮转方式(size/time)
    • Mode: 输出模式(file/console)
    • ToConsole: 是否同时输出到控制台

2.3 日志轮转

  • 支持两种轮转方式:
    • 基于大小(size): 超过MaxSize触发轮转
    • 基于时间(time): 按时间周期轮转
  • 轮转特性:
    • 自动压缩旧日志文件(.gz)
    • 控制备份文件数量(MaxBackups)
    • 支持删除过期日志(KeepDays)

2.4 临时日志级别

  • SetOpenTime: 设置临时提升日志级别
    • duration=0: 永久生效
    • duration>0: 临时生效指定时间
  • GetOpenTime: 获取当前设置
    • 返回>0: 剩余生效时间
    • 返回=0: 永久生效
    • 返回=-1: 已失效

3. 核心流程

3.1 初始化流程

graph TD
 A[开始] --> B[调用InitWithConfig]
 B --> C{验证配置}
 C -->|验证失败| D[返回错误]
 C -->|验证成功| E[转换为内部配置]
 E --> F[调用internal.SetUp]
 F --> G{检查是否输出到控制台}
 G -->|是| H[添加控制台输出]
 G -->|否| I[完成初始化]
 H --> I
 I --> J[结束]
 D --> J
Loading

3.2 日志写入流程

sequenceDiagram
 participant App as "应用程序"
 participant Logger as "日志接口"
 participant Internal as "内部实现"
 participant Writer as "日志写入器"
 participant File as "日志文件"
 App->>Logger: 调用日志方法(Debug/Info/Warn/Error)
 Logger->>Internal: 格式化日志消息
 Internal->>Internal: 检查日志级别
 alt 日志级别允许
 Internal->>Writer: 写入日志
 Writer->>Writer: 检查是否需要轮转
 alt 需要轮转
 Writer->>File: 创建新日志文件
 Writer->>File: 压缩旧日志文件
 end
 Writer->>File: 写入日志内容
 end
Loading

3.3 临时日志级别流程

sequenceDiagram
 participant App as 应用程序
 participant qlog as qlog模块
 participant Timer as 定时器
 participant Level as 日志级别管理
 App->>qlog: SetOpenTime(duration)
 qlog->>qlog: 获取互斥锁
 qlog->>Timer: 停止已存在的定时器
 
 alt duration = 0
 qlog->>Level: 保持当前日志级别
 else duration > 0
 qlog->>Timer: 创建新定时器
 Timer-->>Timer: 等待duration时间
 Timer->>Level: 恢复默认日志级别
 end
 
 qlog->>qlog: 释放互斥锁
Loading

3.4 子进程日志流程

sequenceDiagram
 participant SubProcess as 子进程
 participant ELogger as 子进程日志接口
 participant Channel as 日志通道
 participant MainProcess as 主进程
 participant Writer as 日志写入器
 SubProcess->>ELogger: 写入日志
 ELogger->>ELogger: 格式化日志消息
 ELogger->>Channel: 发送日志项
 Channel->>MainProcess: 传输日志项
 MainProcess->>Writer: 写入日志文件
Loading

3.5 internal 日志主流程逻辑

3.5.1 内部模块设计

graph TD
 A[日志系统入口] --> B[配置初始化 LogConf]
 B --> C{日志模式选择}
 C -->|Console模式| D[控制台输出]
 C -->|File模式| E[文件输出]
 
 E --> F[日志文件管理]
 F --> G[轮转策略]
 G --> H[按天轮转 DailyRotateRule]
 G --> I[按大小轮转 SizeLimitRotateRule]
 
 F --> J[健康检查 HealthChecker]
 J --> K[错误监控]
 K --> L[自动恢复]
 
 F --> M[压缩归档]
 M --> N[Gzip压缩]
 M --> O[清理过期日志]
Loading

3.5.2 日志写入流程

graph TD
 A[写入日志] --> B[日志级别过滤]
 B --> C{日志级别判断}
 C -->|Debug| D[调试日志]
 C -->|Info| E[信息日志]
 C -->|Warn| F[警告日志]
 C -->|Error| G[错误日志]
 
 D --> H[日志写入器]
 E --> H
 F --> H
 G --> H
 
 H --> I[缓冲通道]
 I --> J[异步写入]
 J --> K{健康检查}
 K -->|正常| L[写入文件]
 K -->|异常| M[错误恢复]
 M --> K
Loading

4. 使用示例

4.1 基础初始化

config := qlog.Config{
 ServiceName: "tts",
 ServerLogDir: "/path/to/server/logs",
 ManagerLogDir: "/path/to/manager/logs", 
 MaxBackups: 7,
 MaxSize: 100,
 Level: "ERR",
 Compress: true,
 Rotation: "size",
 Mode: "file",
 ToConsole: true,
}
err := qlog.InitWithConfig(config)
if err != nil {
 panic(err)
}

4.2 获取日志记录器

rlog := qlog.GetRLog("module_name")
rlog.Trace("这是一条追踪日志")
rlog.Debug("这是一条调试日志")
rlog.Info("这是一条信息日志")
rlog.Warn("这是一条警告日志")
rlog.Error("这是一条错误日志")
// 带追踪ID的运行日志
// 已在前面的示例中更新
tracedLog.Info("带追踪ID的日志")
alog := qlog.GetALog()
alog.Print("访问日志")
alog.Printf("格式化的访问日志: %s", "example")
elog := qlog.GetELog("subprocess_module_name")
elog.Info("子进程信息")

4.3 性能追踪

// 使用TimeTrackWithDebug追踪函数执行时间
defer qlog.TimeTrackWithDebug(rlog, "test")()
// 使用TimeTrackWithTrace追踪函数执行时间
defer qlog.TimeTrackWithTrace(rlog, "test")()
// 使用TimeTrackWithInfo追踪函数执行时间
defer qlog.TimeTrackWithInfo(rlog, "test")()

5. 注意事项

  1. 如果需要写入文件则使用前必须先调用InitWithConfig()进行初始化
  2. 在文件模式下,ServerLogDir和ManagerLogDir不能为空
  3. 程序退出前建议调用UnInit()清理资源
  4. 日志级别字符串不区分大小写
  5. 子进程日志(ELogger)通过channel传递日志到主进程
  6. 临时提升日志级别后会自动恢复默认级别

6. 许可证

本项目采用 MIT许可证

About

A Go logging library

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /