Skip to content

Latest commit

 

History

History
118 lines (104 loc) · 4 KB

logger.md

File metadata and controls

118 lines (104 loc) · 4 KB

记录和管理 API 日志

本小节源码下载路径:demo03

apiserver 所采用的日志包lexkong/log,特点:

  • 支持日志输出流配置,可以输出到 stdout 或 file,也可以同时输出到 stdout 和 file
  • 支持输出为 JSON 或 plaintext 格式
  • 支持彩色输出
  • 支持 log rotate 功能
  • 高性能

初始化日志包

conf/config.yaml中添加log配置:

runmode: debug                 # 开发模式, debug, release, test
addr: :8080                  # HTTP绑定端口
name: apiserver              # API Server的名字
url: http://127.0.0.1:8080   # pingServer函数请求的API服务器的ip:port
max_ping_count: 10           # pingServer函数try的次数
log:
  writers: file,stdout
  logger_level: DEBUG
  logger_file: log/apiserver.log
  log_format_text: false
  rollingPolicy: size
  log_rotate_date: 1
  log_rotate_size: 1
  log_backup_count: 7

config/config.go中添加日志初始化代码:

package config

import (
    ....
    "github.com/lexkong/log"
    ....
)
....
func Init(cfg string) error {
    ....
    // 初始化配置文件
    if err := c.initConfig(); err != nil {
        return err
    }

    // 初始化日志包
    c.initLog()
    ....
}

func (c *Config) initConfig() error {
    ....
}

func (c *Config) initLog() {
    passLagerCfg := log.PassLagerCfg {
        Writers:        viper.GetString("log.writers"),
        LoggerLevel:    viper.GetString("log.logger_level"),
        LoggerFile:     viper.GetString("log.logger_file"),
        LogFormatText:  viper.GetBool("log.log_format_text"),
        RollingPolicy:  viper.GetString("log.rollingPolicy"),
        LogRotateDate:  viper.GetInt("log.log_rotate_date"),
        LogRotateSize:  viper.GetInt("log.log_rotate_size"),
        LogBackupCount: viper.GetInt("log.log_backup_count"),
    }

    log.InitWithConfig(&passLagerCfg)
}

// 监控配置文件变化并热加载程序
func (c *Config) watchConfig() {
    ....
}

这里要注意,日志初始化函数c.initLog()要放在配置初始化函数c.initConfig()之后,因为日志初始化函数要读取日志相关的配置。 func (c *Config) initLog()是日志初始化函数,会设置日志包的各项参数,参数为:

  • writers:输出位置,有两个可选项filestdout。选择file会将日志记录到logger_file指定的日志文件中,选择stdout会将日志输出到标准输出, 当然也可以两者同时选择
  • logger_level:日志级别,DEBUG、INFO、WARN、ERROR、FATAL
  • logger_file:日志文件
  • log_format_text:日志的输出格式,JSON 或者 plaintext,true会输出成非 JSON 格式,false会输出成 JSON 格式
  • rollingPolicy:rotate 依据,可选的有dailysize。如果选daily则根据天进行转存,如果是size则根据大小进行转存
  • log_rotate_date:rotate 转存时间,配合rollingPolicy: daily使用
  • log_rotate_size:rotate 转存大小,配合rollingPolicy: size使用
  • log_backup_count:当日志文件达到转存标准时,log 系统会将该日志文件进行压缩备份,这里指定了备份文件的最大个数

lexkong/log替换掉之前的 log 包。

管理日志文件

这里将日志转存策略设置为size,转存大小设置为1 MB

  rollingPolicy: size
  log_rotate_size: 1

并在main函数中加入测试代码:

	// Set gin mode.
	gin.SetMode(viper.GetString("runmode"))

	for {
	    log.info("111111111111111111111111111111111111")
	    time.Sleep(100 * time.Millisecond)
	}

启动 apiserver 后发现,在当前目录下创建了log/apiserver.log日志文件:

$ ls log/
apiserver.log

程序运行一段时间后,发现又创建了 zip 文件:

$ ls log/
apiserver.log  apiserver.log.20180531134509631.zip

该 zip 文件就是当apiserver.log大小超过 1MB 后,日志系统将之前的日志压缩成 zip 文件后的文件。