最主要一点, zap的可以给出详细的log信息, 形如

2023-02-10T09:24:55.707+0800 INFO v3web/main.go:196 [2023-02-10 09:24:55]consumed=291254, total=24168775, timecost=20, speed=14562, avg=10886

这样就能非常方便的知道,日志所在的代码位置

logger/log.go

  1 package logger
2
3 import (
4 "os"
5
6 "gopkg.in/natefinch/lumberjack.v2"
7
8 "go.uber.org/zap"
9 "go.uber.org/zap/zapcore"
10 )
11
12 var errorLogger *zap.SugaredLogger
13
14 func init() {
15 // 设置一些基本日志格式 具体含义还比较好理解,直接看zap源码也不难懂
16 writeSyncer := getLogWriter()
17 encoder := getEncoder()
18 core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
19 logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
20 errorLogger = logger.Sugar()
21 //
22 //encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
23 // MessageKey: "msg",
24 // LevelKey: "level",
25 // EncodeLevel: zapcore.CapitalLevelEncoder,
26 // TimeKey: "ts",
27 // EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
28 // enc.AppendString(t.Format("2006-01-02 15:04:05"))
29 // },
30 // CallerKey: "file",
31 // EncodeCaller: zapcore.ShortCallerEncoder,
32 // EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
33 // enc.AppendInt64(int64(d) / 1000000)
34 // },
35 //})
36 //// 实现两个判断日志等级的interface
37 //infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
38 // return lvl >= zapcore.InfoLevel
39 //})
40 //errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
41 // return lvl >= zapcore.ErrorLevel
42 //})
43 //// 获取 info、error日志文件的io.Writer 抽象 getWriter() 在下方实现
44 //infoWriter := getWriter("./logs/gossip.log")
45 //errorWriter := getWriter("./logs/gossip_error.log")
46 //// 最后创建具体的Logger
47 //core := zapcore.NewTee(
48 // zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
49 // zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),
50 //)
51 //log := zap.New(core, zap.AddCaller()) // 需要传入 zap.AddCaller() 才会显示打日志点的文件名和行数, 有点小坑
52 //errorLogger = log.Sugar()
53 }
54
55 func getEncoder() zapcore.Encoder {
56 encoderConfig := zap.NewProductionEncoderConfig()
57 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
58 encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
59 return zapcore.NewConsoleEncoder(encoderConfig)
60 }
61
62 func getLogWriter() zapcore.WriteSyncer {
63 lumberJackLogger := &lumberjack.Logger{
64 Filename: "./app.log",
65 MaxSize: 10, // 10M
66 MaxBackups: 5, // 5个
67 MaxAge: 30, // 最多30天
68 Compress: false,
69 }
70 //return zapcore.AddSync(lumberJackLogger)
71 return zapcore.NewMultiWriteSyncer(
72 zapcore.AddSync(os.Stdout),
73 zapcore.AddSync(lumberJackLogger))
74 }
75
76 func Debug(args ...interface{}) {
77 errorLogger.Debug(args...)
78 }
79 func Debugf(template string, args ...interface{}) {
80 errorLogger.Debugf(template, args...)
81 }
82 func Info(args ...interface{}) {
83 errorLogger.Info(args...)
84 }
85 func Infof(template string, args ...interface{}) {
86 errorLogger.Infof(template, args...)
87 }
88 func Warn(args ...interface{}) {
89 errorLogger.Warn(args...)
90 }
91 func Warnf(template string, args ...interface{}) {
92 errorLogger.Warnf(template, args...)
93 }
94 func Error(args ...interface{}) {
95 errorLogger.Error(args...)
96 }
97 func Errorf(template string, args ...interface{}) {
98 errorLogger.Errorf(template, args...)
99 }
100 func DPanic(args ...interface{}) {
101 errorLogger.DPanic(args...)
102 }
103 func DPanicf(template string, args ...interface{}) {
104 errorLogger.DPanicf(template, args...)
105 }
106 func Panic(args ...interface{}) {
107 errorLogger.Panic(args...)
108 }
109 func Panicf(template string, args ...interface{}) {
110 errorLogger.Panicf(template, args...)
111 }
112 func Fatal(args ...interface{}) {
113 errorLogger.Fatal(args...)
114 }
115 func Fatalf(template string, args ...interface{}) {
116 errorLogger.Fatalf(template, args...)
117 }

在调用方的go.mod中

module logp_web

go 1.14

require (
logger v0.0.0
) replace logger => ./logger

再在调用方的代码中加入  import logger ,  就可以使用了

logger.Info

logger.Infof

golang 不再使用原生的log, 使用固定的zap logger的更多相关文章

  1. Golang 源码剖析:log 标准库

    Golang 源码剖析:log 标准库 原文地址:Golang 源码剖析:log 标准库 日志 输出 2018/09/28 20:03:08 EDDYCJY Blog... 构成 [日期]<空格 ...

  2. Golang 标准库提供的Log(一)

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1405754 G ...

  3. golang中的标准库log

    Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...

  4. golang之log rotate

    操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 golang的log模块提供的有写日志功能,示例代码如下: /* golang log example E-Mail : ...

  5. Golang官方log包详解

    Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...

  6. Golang 标准库log的实现

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1406905 前 ...

  7. 基于 Golang 构建高可扩展的云原生 PaaS(附 PPT 下载)

    作者|刘浩杨 来源|尔达 Erda 公众号 ​ 本文整理自刘浩杨在 GopherChina 2021 北京站主会场的演讲,微信添加:Erda202106,联系小助手即可获取讲师 PPT. 前言 当今时 ...

  8. golang package log

    package main import ( "log" "os" ) var logger *log.Logger func main() { file, er ...

  9. golang log日志

    写入日志文件 func main() { file, err := os.Create("test.log") if err != nil { log.Fatalln(" ...

  10. golang kafka

    golang kafka – hello world https://github.com/Shopify/sarama https://shopify.github.io/sarama/   con ...

随机推荐

  1. Python基础语法复习笔记(一):字符串

    python基础复习笔记 个人主页:JoJo的数据分析历险记 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生 如果文章对你有帮助,欢迎关注.点赞.收藏.订阅专栏 本专栏主要 ...

  2. Codeforces 1132E(大数据多重背包)

    题目链接 题意 给定背包容量$w$,体积分别为$1$到$8$的物体的数量求不超过背包容量的最大体积 思路 考虑将答案转化成$840 * x + y$的形式其中$840 = lcm(1-8), y &l ...

  3. 使用JIMO ActionOne HongHu 及其他MR VR眼镜,将真实场景和游戏内场景混合渲染

    1. 在VR相机Head内创建一个 Camera 和两个RawImage(Camera 的参数和VRCamera的参数一致, 两个RawImage尺寸一致, 要把VRCamera的相机遮挡住 ) 2. ...

  4. Cannot read properties of null (reading ‘insertBefore‘)

    一.报错现象 vue3 + element plus 项目,本地启动时,页面进行所有操作都正常:部署到test环境后,数据驱动DOM变化的操作会导致如下报错. 二.可能原因及解决方案 经过分析出现报错 ...

  5. ES6 新语法新特性总结中...

    1. 感觉 for of   通杀 for循环 和 for in呢 aaa 可以是array /object for (let k of aaa) {     console.log(k) }   2 ...

  6. Centos操作系统在虚拟机VMware上的安装(二)

    a:hover { color: rgba(255, 102, 0, 1) } 1.下载centos操作系统,提供百度云盘链接:http://pan.baidu.com/s/1pLHOR03 2.打开 ...

  7. @click,@click.native失效问题(原生js代码innerHTML中填充vue页面,页面中点击事件失效)

    解决方式: window.mapVue = this <input onclick="window.mapVue.locusPath()" type="button ...

  8. jmeter接口自动化-读取CSV文件执行测试用例

    一.在csv文件中编写好用例 首先在csv文件首行填写相关参数并编写测试用例.脚本可通过优先级参数控制执行哪些接口,通过请求方式执行不同端口下的接口,再读取csv文件时进行参数化. 二.设计测试脚本并 ...

  9. 利用canvas合并两个海报

    图片1 是个海报,图片2是个二维码,把这个二维码镶嵌到图片1 的指定位置上 function drawAndShareImage(opt, cb) { if (!opt) { console.erro ...

  10. shell_Day08

    数组与字符串: 数组 数组就是一段连续的变量,一段连续的内存存储空间 为了解决变量过多的问题: 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义:(列表) 数组名[索引]=值 定义数组 ...