Vestmore_GO/utils/log/readme.md
2024-04-09 18:17:08 +08:00

74 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Log Package README
## 概述
此`log`包提供了一套全面的日志记录功能,基于`github.com/sirupsen/logrus`库进行了深度定制和扩展。通过本包,您可以实现多级别的日志输出,并能灵活控制日志格式、时间戳显示以及调用栈信息等。
用于fusen的全部服务的统一格式化, 便于运维统一处理。
### 功能特性
1. **多级别日志**:支持`Trace`、`Debug`、`Info`、`Warn`、`Error`、`Fatal`和`Panic`等多种日志级别。
2. **追踪时间**:包含`DebuglnTrackTime`与`InfolnTrackTime`函数,用于执行指定函数并在输出时附加执行耗时(毫秒)。
3. **UTC时间**:使用了自定义的`UTCTimeHook`钩子确保所有日志的时间戳采用协调世界时UTC格式。
4. **JSON格式化**:实现了`JSONFormatter`结构体将日志条目格式化为可解析的JSON字符串。它自动跳过与logrus库自身相关的调用层级以便更准确地显示应用代码中的文件和行号信息。
5. **上下文关联**:提供了`WithContext`方法允许在日志条目中携带Go context.Context便于进行请求级或事务级的跟踪。
6. **错误处理**:通过`WithError`方法可以在日志条目中便捷地添加错误对象。
7. **时间戳覆盖**`WithTime`方法允许开发者为日志条目设置特定的时间戳。
8. **灵活格式化**:除了基本的日志输出外,还支持带有格式字符串的函数如`Printf`、`Debugf`等,以适应不同的消息格式需求。
9. **源码定位**:已启用报告调用者位置的功能,每条日志都会附带其产生的源代码文件名及行号。
### 使用示例
```go
package main
import (
"github.com/yourorg/log" // 替换为实际导入路径
"time"
)
func main() {
log.Debugln("This is a debug message.")
log.Infoln("Normal info message.")
// 添加自定义字段并格式化输出
entry := log.WithField("user_id", "123")
entry.Info("User logged in.")
// 记录并追踪函数执行时间
log.DebuglnTrackTime(func() {
time.Sleep(200 * time.Millisecond)
}, "Function execution")
// 设置日志上下文
ctx := context.Background()
ctx = log.WithContext(ctx, "request_id", "abc123")
log.Infof(ctx, "Received request with ID: %s", "abc123")
// 输出JSON格式化的日志
log.SetFormatter(&log.JSONFormatter{})
log.Warn("JSON-formatted warning.")
}
```
### 配置选项
- 在初始化阶段已经配置了Logstash作为日志输出的目标。
- 可通过修改`l.Formatter`属性来更换或自定义日志格式器。
- 通过`AddHook`方法可以添加自定义的钩子,比如这里有一个未使用的`SkipHook`,它可以用来过滤调用栈。
### 注意事项
- 当需要同时记录多个字段时,请使用`WithFields`方法而不是多次调用`WithField`。
- 若要调整日志输出级别请直接操作全局logger实例的level设置。
### 结构体与方法详解
- `levelSkip` 结构体用于在堆栈跟踪过程中计算需要跳过的层级数。
- `UTCTimeHook` 是一个自定义钩子当触发时会将日志条目的时间戳设置为当前UTC时间。
- `JSONFormatter` 实现了`Format`方法将日志条目转化为JSON格式。