出错

using unaddressable value

var config = &Config{}

系统库

检查文件存在

// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
    if _, err := os.Stat(name); err != nil {
        if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

文件夹不存在则创建

	if _, err := os.Stat(logDir); os.IsNotExist(err) {
		err := os.Mkdir(logDir, 0755)
		if err != nil {
			panic(fmt.Sprintf("Unable to create log dir: %v", err))
		}
	}

日志库 zap

两种模式:

  • Sugar 模式:支持 printf,代价是性能变差。通过 myLogger.Sugar () 获得

创建日志记录器

  • zap.New (core, options) 需要自定义 core
  • zap.NewProduction (options) 以 Info 的级别进行记录
  • zap.NewDevelopment (options) 以 Debug 的级别记录
  • zap.NewExample (options) 以 Debug 的级别记录,每次都同步,无缓冲,会降低性能

Logger 的创建:

log := zap.New(cores, zap.AddCaller())

其中,zap.AddCaller () 用于提供显示出错的代码位置(调用者)的功能。

Core 的创建:

cores := zapcore.NewTee(
    zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
    zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),
)

这种是多核模式。也可以直接上单核:

core := zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),

Log Level 过滤:

errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
    return lvl >= zapcore.ErrorLevel
})

Encoder 自定义:

encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
    MessageKey:  "msg",
    LevelKey:    "level",
    EncodeLevel: zapcore.CapitalLevelEncoder,
    TimeKey:     "ts",
    EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
        enc.AppendString(t.Format("2006-01-02 15:04:05"))
    },
    CallerKey:    "file",
    EncodeCaller: zapcore.ShortCallerEncoder,
    EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
        enc.AppendInt64(int64(d) / 1000000)
    },
})

这些都是 Json 格式的日志使用的。

官方小栗子:

logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
  // Structured context as loosely typed key-value pairs.
  "url", url,
  "attempt", 3,
  "backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)

ZAP 日志库使用方法 - 还是蓝白的好 (aoitoshiro.com)

database/sql