跳到主要内容

日志

日志

框架日志组件内置了Uber Zap+Rotate组合,采用文件流记录日志.

文件流方式为性能最高的一种方式,满足绝大部分应用场景. 对于日志收集中间件来说文件采集支持也是必备的.

为了支持不同场景下的使用,具有多种使用方式:

  • 普通日志: 类似go及zap的使用方式.
log.Info("hello world")
  • 组件日志:
logger := log.Component("component-name")
logger.Info("hello world")
  • 上下文日志: 把上下文信息记录到日志

    每一次调用Ctx创建ContextLogger后调用日志记录方法,都会回收ContextLogger,因此应避免.

logger := log.Component("component-name")
logger.Ctx(ctx).Info("hello world")
// 不可以使用下面的方式
clog := logger.Ctx(ctx)
clog.Info("hello world")
clog.Info("hello world1")

配置结构如下:

log:
disableTimestamp: false # encoder text 时,是否显示时间戳
disableErrorVerbose: false # encoder text 时,是否显示错误详情
callerSkip: 1 # 跳过的调用层级
# 单日志组件,不需要复杂日志记录时一般采用sole
cores:
- level: debug
disableCaller: true
disableStacktrace: true
encoding: json #json console text 三种格式
encoderConfig:
timeEncoder: iso8601 # 默认值
# outputPaths 日志输出路径,支持stdout,stderr,文件路径
# default: stderr. 使用的zap的默认值.
outputPaths:
- stdout
- "test.log"
errorOutputPaths:
- stderr
# 采用文件流时,轮转配置可方便管理与跟踪日志,可选配置;
rotate:
maxSize: 1
maxage: 1
maxbackups: 1
localtime: true
compress: false

rotate可只保留key,不配置值,则使用默认值.默认值如下:

  • MaxSize: 单文件最大大小, 100MB
  • MaxAge: 文件保留天数, 不限制
  • MaxBackups: 保留文件个数, 不限制
  • LocalTime: false, 使用UTC时间
  • Compress: false, 不压缩

时间格式

时间格式的配置是相对特殊的,作用于zap.Time相似的方法,timeEncoder支持配置如下:

  • "rfc3339nano" 或 "RFC3339Nano" 对应 RFC3339NanoTimeEncoder.
  • "rfc3339" 或 "RFC3339" 对应 RFC3339TimeEncoder.
  • "iso8601" 或 "ISO8601" 对应 ISO8601TimeEncoder.
  • "millis" 对应 EpochMillisTimeEncoder.
  • "nanos" 对应 EpochNanosEncoder.

在不满足时,可以自定义格式:

  timeEncoder:
layout: 06/01/02 03:04pm

mulit-logger

  # 日志组件,需要复杂日志记录时一般采用multi
cores:
- level: debug
disableCaller: true
disableStacktrace: true
encoding: json
encoderConfig:
timeEncoder: iso8601
outputPaths:
- stdout
- "test.log"
errorOutputPaths:
- stderr
- level: warn
disableCaller: true
outputPaths:
- "test.log"
errorOutputPaths:
- stderr

内置配置基于Zap的Config对象

Web访问日志

在web服务中,经常需要记录访问日志,框架提供了一个中间件,用于记录访问日志,同时搭配recovery中间件来处理panic错误.

web:
server:
addr: 0.0.0.0:33333
engine:
routerGroups:
- default:
middlewares:
- accessLog:
exclude:
- /healthCheck

Error的处理:

  • 对于内部错误时,记录类型为Error
  • 对于公共错误,如404,500等,记录类型为Info

Panic的处理: 额外记录stacktrace

grpc服务端访问日志

grpc访问日志以拦截器形式实现支持,搭配recovery拦截器来附加panic错误.

grpc:
server:
engine:
- unaryInterceptors:
- accessLog:
timestampFormat: "2006-01-02 15:04:05"
- recovery:

Error的处理根据grpc的状态码来判断: 详见interceptor.DefaultCodeToLevel函数

Panic的处理: 额外记录stacktrace

结合标准库

在使用某些第三方库时.如果支持设置io.Writer,则可转化为woocoo的日志.log库内置了实现io.Writer类,可直接使用.

import (
"log"
wclog "github.com/tsingsun/woocoo/pkg/log"
)
w := &wclog.Writer{
Log: wclog.Global().Logger(),
// Level 默认级别
Level: zap.InfoLevel,
}
log.SetOutput(w)
// 或者使用Component时,可以直接使用
logger = wclog.Component("web")
log.SetOutput(logger.Logger().IOWriter(zapcore.DebugLevel))

除了转换功能外,还可通过识别如[{level}]文本提取日志级别,并记录到日志中.

支持的文本有: debug,info,warn,error,fatal,panic, 例如:

// 使用标准库记录
log.Print("[debug]hello world")
log.Print("[DEBUG]hello world")
log.Println("Web [info] hello world")