Categorygithub.com/axiaoxin-com/logging
modulepackage
1.2.20
Repository: https://github.com/axiaoxin-com/logging.git
Documentation: pkg.go.dev

# README

logging

Go Report Card Codacy Badge

logging 简单封装了在日常使用 zap 打日志时的常用方法。

  • 提供快速使用 zap 打印日志的方法,除 zap 的 DPanic 、 DPanicf 方法外所有日志打印方法开箱即用
  • 提供多种快速创建 logger 的方法
  • 集成 Sentry,设置 DSN 后可直接使用 Sentry ,支持在使用 Error 及其以上级别打印日志时自动将该事件上报到 Sentry
  • 支持从 Context 中创建、获取带有 Trace ID 的 logger
  • 提供 gin 的日志中间件,支持使用 logging 的 logger 打印访问日志,支持 Trace ID,可以记录更加详细的请求和响应信息,支持通过配置自定义。
  • 支持服务内部函数方式和外部 HTTP 方式动态调整日志级别,无需修改配置、重启服务
  • 支持自定义 logger Encoder 配置
  • 支持将日志保存到文件并自动 rotate
  • 支持 Gorm 日志打印 Trace ID

logging 只提供 zap 使用时的常用方法汇总,不是对 zap 进行二次开发,拒绝过度封装。

安装

go get -u github.com/axiaoxin-com/logging

开箱即用

logging 提供的开箱即用方法都是使用自身默认 logger 克隆出的 CtxLogger 实际执行的。 在 logging 被 import 时,会生成内部使用的默认 logger 。 默认 logger 使用 JSON 格式打印日志内容到 stderr 。 默认不带 Sentry 上报功能,可以通过设置环境变量或者替换 logger 方法支持。 默认 logger 可通过代码内部动态修改日志级别, 默认不支持 HTTP 方式动态修改日志级别,需要指定端口创建新的 logger 来支持。 默认带有初始字段 pid 打印进程 ID 。

开箱即用的方法第一个参数为 context.Context, 可以传入 gin.Context ,会尝试从其中获取 Trace ID 进行日志打印,无需 Trace ID 可以直接传 nil

示例 example/logging.go

全局开箱即用的方法默认不支持 sentry 自动上报 Error 级别的事件,有两种方式可以使其支持:

  1. 通过设置系统环境变量 SENTRY_DSNSENTRY_DEBUG 来实现自动上报。

  2. 也可以通过替换默认 logger 来实现让全局方法支持 Error 以上级别自动上报。

示例 example/replace.go

快速获取、创建你的 Logger

logging 提供多种方式快速获取一个 logger 来打印日志

示例 example/logger.go

带 Trace ID 的 CtxLogger

每一次函数或者 gin 的 http 接口调用,在最顶层入口处都将一个带有唯一 trace id 的 logger 放入 context.Context 或 gin.Context , 后续函数在内部打印日志时从 Context 中获取带有本次调用 trace id 的 logger 来打印日志几个进行调用链路跟踪。

示例 1 普通函数中打印打印带 Trace ID 的日志 example/context.go

示例 2 gin 中打印带 Trace ID 的日志 example/gin.go:

动态修改 logger 日志级别

logging 可以在代码中对 AtomicLevel 调用 SetLevel 动态修改日志级别,也可以通过请求 HTTP 接口修改。 创建 logger 时可自定义端口运行 HTTP 服务来接收请求修改日志级别。实际使用中日志级别通常写在配置文件中, 可以通过监听配置文件的修改来动态调用 SetLevel 方法。

示例 example/atomiclevel.go

自定义 logger Encoder 配置

示例 example/encoder.go

日志保存到文件并自动 rotate

使用 lumberjack 将日志保存到文件并 rotate ,采用 zap 的 RegisterSink 方法和 Config.OutputPaths 字段添加自定义的日志输出的方式来使用 lumberjack 。

示例 example/lumberjack.go

支持 Gorm 日志打印 Trace ID

使用 gorm v2 支持 context logger 打印 trace id

示例 example/gorm.go

gin middleware: GinLogger

GinLogger uses zap to log detailed access logs in JSON or text format with trace id, supports flexible and rich configuration, and supports automatic reporting of log events above error level to sentry

相关文章: https://github.com/axiaoxin/axiaoxin/issues/17

示例: example/ginlogger.go

# Functions

AttachCore add a core to zap logger.
CallerEncoder serializes a caller in package/file:funcname:line format.
CloneLogger return the global logger copy which add a new name.
CtxLogger get the ctxLogger in context.
CtxTraceID get trace id from context Modify TraceIDPrefix change change the prefix.
Debug 尝试从 Context 中获取带 trace id 的 logger 记录 debug 级别的日志.
Debugf 尝试从 Context 中获取带 trace id 的 sugared logger 来模板字符串记录 debug 级别的日志 logging.Debugf(nil, "str:%s", "abd").
Debugs 尝试从 Context 中获取带 trace id 的 sugared logger 来记录 debug 级别的日志 logging.Debugs(nil, "abc", 123).
Debugw 尝试从 Context 中获取带 trace id 的 sugared logger 来 kv 记录 debug 级别的日志 logging.Debugw(nil, "msg", "k1", "v1", "k2", "v2").
Error 尝试从 Context 中获取带 trace id 的 logger 记录 error 级别的日志.
Errorf 尝试从 Context 中获取带 trace id 的 sugared logger 来模板字符串记录 error 级别的日志.
Errors 尝试从 Context 中获取带 trace id 的 sugared logger 来记录 Error 级别的日志.
Errorw 尝试从 Context 中获取带 trace id 的 sugared logger 来 kv 记录 error 级别的日志.
ExtraField 顺序传入 kv 对,返回以 extra 为 key ,传入的 kv 对组成的 map 为值的 zap Reflect Field 在需要固定日志外层 json 字段有需要添加新字段时可以使用.
Fatal 尝试从 Context 中获取带 trace id 的 logger 记录 fatal 级别的日志.
Fatalf 尝试从 Context 中获取带 trace id 的 sugared logger 来模板字符串记录 fatal 级别的日志.
Fatals 尝试从 Context 中获取带 trace id 的 sugared logger 来记录 Fatal 级别的日志.
Fatalw 尝试从 Context 中获取带 trace id 的 sugared logger 来 kv 记录 fatal 级别的日志.
FuncName 返回调用本函数的函数名称 pc runtime.Caller 返回的第一个值.
GetGinRequestBody 获取请求 body.
GetGinTraceIDFromHeader 从 gin 的 request header 中获取 key 为 TraceIDKeyname 的值作为 traceid.
GetGinTraceIDFromPostForm 从 gin 的 postform 中获取 key 为 TraceIDKeyname 的值作为 traceid.
GetGinTraceIDFromQueryString 从 gin 的 querystring 中获取 key 为 TraceIDKeyname 的值作为 traceid.
GinLogger 以默认配置生成 gin 的 Logger 中间件.
GinLoggerWithConfig 根据配置信息生成 gin 的 Logger 中间件 中间件会记录访问信息,根据状态码确定日志级别, 500 以上为 Error , 400-500 默认为 Warn , 400 以下默认为 Info api 请求进来的 context 的函数无需在其中打印 err ,使用 c.Error(err)会在请求完成时自动打印 error context 中有 error 则日志忽略返回码始终使用 error 级别.
Info 尝试从 Context 中获取带 trace id 的 logger 记录 info 级别的日志.
Infof 尝试从 Context 中获取带 trace id 的 sugared logger 来模板字符串记录 info 级别的日志.
Infos 尝试从 Context 中获取带 trace id 的 sugared logger 来记录 info 级别的日志.
Infow 尝试从 Context 中获取带 trace id 的 sugared logger 来 kv 记录 info 级别的日志.
NewCtxLogger return a context with logger and trace id and a logger with trace id.
NewGormLogger 返回带 zap logger 的 GormLogger.
NewLogger return a zap Logger instance.
NewLumberjackSink 创建 LumberjackSink 对象.
NewSentryClient return sentry client by sentrydsn.
NewSentryCore new a sentry core.
Panic 尝试从 Context 中获取带 trace id 的 logger 记录 panic 级别的日志.
Panicf 尝试从 Context 中获取带 trace id 的 sugared logger 来模板字符串记录 panic 级别的日志.
Panics 尝试从 Context 中获取带 trace id 的 sugared logger 来记录 Panic 级别的日志.
Panicw 尝试从 Context 中获取带 trace id 的 sugared logger 来 kv 记录 panic 级别的日志.
RegisterLumberjackSink 注册 lumberjack sink 在 OutputPaths 中指定输出为 sink.Scheme://log_filename 即可使用 path url 中不指定日志文件名则使用默认的名称 一个 scheme 只能对应一个文件名,相同的 scheme 注册无效,会全部写入同一个文件.
ReplaceLogger 替换默认的全局 logger 为传入的新 logger 返回函数,调用它可以恢复全局 logger 为上一次的 logger.
SentryAttach attach sentrycore.
SentryCaptureException 上报 error 信息到 sentry.
SentryCaptureMessage 上报 message 信息到 sentry.
SentryClient 返回默认 sentry client.
ServerIP 获取当前 IP.
SetLevel 使用字符串级别设置默认 logger 的 atomic level.
TextLevel 返回默认 logger 的 字符串 level.
TimeEncoder 自定义日志时间格式, 不带时区信息, YYYY-mm-dd H:M:S.xxxxxx.
Warn 尝试从 Context 中获取带 trace id 的 logger 记录 warn 级别的日志.
Warnf 尝试从 Context 中获取带 trace id 的 sugared logger 来模板字符串记录 warn 级别的日志.
Warns 尝试从 Context 中获取带 trace id 的 sugared logger 来记录 warn 级别的日志.
Warnw 尝试从 Context 中获取带 trace id 的 sugared logger 来 kv 记录 warn 级别的日志.

# Constants

AtomicLevelAddrEnvKey 初始化时尝试获取该环境变量用于设置动态修改日志级别的 http 服务运行地址.
LogFilename 默认日志文件名.

# Variables

AtomicLevelMap string level mapping zap AtomicLevel.
CtxLoggerName define the ctx logger name.
EncoderConfig 默认的日志字段名配置.
GormLoggerCallerSkip caller skip.
GormLoggerName gorm logger 名称.
TraceIDKeyname define the trace id keyname.
TraceIDPrefix set the prefix when gen a trace id.
ZapcoreLevelMap string level mapping zapcore.Level.

# Structs

AtomicLevelServerOption AtomicLevel server 相关配置.
GinLogDetails gin 日志中间件记录的信息.
GinLoggerConfig GinLogger 支持的配置项字段定义.
GormLogger 使用 zap 来打印 gorm 的日志 初始化时在内部的 logger 中添加 trace id 可以追踪 sql 执行记录.
LumberjackSink 将日志输出到 lumberjack 进行 rotate.
Options new logger options.
SentryCoreConfig is a minimal set of parameters for Sentry Core.

# Type aliases

Ctxkey context key 类型.