上一篇文章基本是炮灰
准备高性能
遇到同样的问题 我run readme的代码 无法下载OK
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
// UNIX Time is faster and smaller than most timestamps
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.Print("hello world")
}
// Output: {"time":1516134303,"level":"debug","message":"hello world"}
本来也是计划git clone的
算了 百度:GOlang 代理
果然是我的代理不行啊换一个就好了
go env -w GO111MODULE=on // Windows
export GO111MODULE=on // macOS 或 Linux
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/ // Windows
export GOPROXY=https://mirrors.aliyun.com/goproxy/ // macOS 或 Linux
看看效果
./KK.exe
就是和官方一样的 一个显示台输出!
测试分级
package main
import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
log.Info().Msg("hello world")
log.Debug().Msgf("D")
log.Error().Msg("error")
log.Warn().Msg("Warn")
}
// Output: {"time":1516134303,"level":"info","message":"hello world"}
这样 只会输出error 其他互虐
继续测试 设置分级 在通过传参修改
package main
import (
"flag"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
debug := flag.Bool("debug", false, "sets log level to debug")
flag.Parse()
// Default level for this example is info, unless debug flag is present
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if *debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
log.Debug().Msg("This message appears only when log level set to Debug")
log.Info().Msg("This message appears when log level set to Debug or Info")
}
全部代码
-debug
直接执行
问题
1--如何输出到文件
2-如何打印%d
package main
import (
"flag"
"fmt"
"os"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/dwdcth/consoleEx"
"github.com/mattn/go-colorable"
)
type LogHook struct{}
func (hook LogHook) Run(e *zerolog.Event, level zerolog.Level, msg string) {
fmt.Println(msg)
}
func main() {
/*
不可以的 os.NewFile不是给普通人用的
myout := os.NewFile(0, "log.txt")
defer myout.Close()
mylogger := zerolog.New(myout)
mylogger.Info().Str("foo", "bar").Msg("mylogger")
https://studygolang.com/topics/2729
*/
/*单独测试狗子2行 https://studygolang.com/articles/25383*/
log.Logger = log.Hook(LogHook{})
log.Info().Msg("ABCD")
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
debug := flag.Bool("debug", false, "sets log level to debug")
flag.Parse()
/*简化输出格式*/
zerolog.TimestampFieldName = "t"
zerolog.LevelFieldName = "l"
zerolog.MessageFieldName = "m"
log.Info().Msg("hello world")
// Default level for this example is info, unless debug flag is present
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if *debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
log.Debug().Msg("This message appears only when log level set to Debug")
log.Info().Msg("This message appears when log level set to Debug or Info")
/*
上面我们使用的都是全局的
这种方式有一个明显的缺点
如果在某个地方修改了设置,将影响全局的日志记录。
为了消除这种影响,我们需要创建新的Logger:
func main() {
logger := zerolog.New(os.Stderr)
logger.Info().Str("foo", "bar").Msg("hello world")
}
*/
logger := zerolog.New(os.Stdout).With().Timestamp().Logger()
// 打印代码行
//logger = logger.With().Caller().Logger()
// 带颜色输出
//logger = logger.Output(zerolog.ConsoleWriter{Out: os.Stderr})
logger.Info().Str("foo", "bar").Msg("全新测试") //有Msg才发出去
/*
换一个测试 https://blog.csdn.net/weixin_33802505/article/details/85991356
就是换了一个输出
*/
out := consoleEx.ConsoleWriterEx{Out: colorable.NewColorableStdout()}
zerolog.CallerSkipFrameCount = 2 //这里根据实际,另外获取的是Msg调用处的文件路径和行号
//logger2 := zerolog.New(out).With().Timestamp().Logger()
//logger2 := zerolog.New(out)
logger2 := zerolog.New(out).With().Caller().Timestamp().Logger()
logger2.Info().Msg("info")
logger2.Debug().Msg("debug")
}
++++++++++++GO ON+++++
献上结论
使用下面的模板
package main
import (
"flag"
"fmt"
"os"
"strings"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
/*
STYLE 1
*/
debug := flag.Bool("debug", false, "sets log level to debug")
zerolog.SetGlobalLevel(zerolog.InfoLevel)
if *debug {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
log.Info().Msg("hello world")
log.Debug().Msg("This message appears only when log level set to Debug")
/*
STYLE 2
*/
logger := zerolog.New(os.Stdout).With().Timestamp().Logger()
// 打印代码行
//logger = logger.With().Caller().Logger()
// 带颜色输出
//logger = logger.Output(zerolog.ConsoleWriter{Out: os.Stderr})
logger.Info().Str("foo", "bar").Msg("全新测试") //有Msg才发出去
/*
STYLE 3 推荐 New 无处不在的结构体现场赋值
*/
//logger2 := zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout, NoColor: false}).With().Timestamp().Logger()
//logger2 := zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout, NoColor: false})
logger2 := zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout, NoColor: false, TimeFormat: time.Stamp}).With().Timestamp().Logger()
logger2.Info().Str("foo", "bar").Msg("Hello World")
logger2.Error().Str("foo", "bar").Msg("Hello World")
/*
STYLE 4
*/
out := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: false}
//下面函数重写 会丢失颜色
//out.FormatLevel = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("%-10s||", i)) }
out.FormatFieldName = func(i interface{}) string { return fmt.Sprintf("<%s>:", i) }
out.FormatFieldValue = func(i interface{}) string { return strings.ToUpper(fmt.Sprintf("[%s]", i)) }
log := zerolog.New(out)
log.Info().Str("key", "value").Msg("Hello World")
log.Error().Str("key", "value").Msg("Hello World")
log.Error().Int("key", 8).Send()
/*
STYLE 5
*/
out5 := zerolog.NewConsoleWriter()
out5.NoColor = false // For testing purposes only
log5 := zerolog.New(out5)
log5.Debug().Str("foo", "bar").Msg("log5")
log5.Error().Str("foo", "bar").Msg("log5")
}
研究过程:
类似这个文章 很多
直接去github看
这是一个孤独的开发 就是自己修改了一下源码1
自己可以学的
https://github.com/dwdcth/consoleEx
他只有一个文件!
Just add format filepath and linenumber for zerolog
仅给zerolog默认的consolewriter添加了一个文件路径和行号格式化,用法见此
https://github.com/rs/zerolog/blob/master/console.go
变化1--源码变大了
变化2--源码func (w ConsoleWriter) Write这个函数以前是一大团 现在单独剥离出去写了
func (w ConsoleWriter) writeFields 看它是小写开头 就是只有一个人使用的
现在源码已经把它的这个特征 加进入了 用户可以自己定义格式的 看我上给的案例
它这个 用法很方便的!new的时候 自己把结构体给进去!!!!!!就可以格式化!
我是怎么做的?
它函数的调用 我去
D:\m_izar_rpi_gw\zerolog\console_test.go
把里面的函数 单独拿出来 自己mian里面跑 就可以!
但是func TestConsoleLogger(t *testing.T) {
带参数的 不知道 以后再学习吧
++++++++++++GOON++++++++++
文件保存
package main
import (
"log"
"os"
)
func init() {
// 获取日志文件句柄
// 以 只写入文件|没有时创建|文件尾部追加 的形式打开这个文件
logFile, err := os.OpenFile(`./日志文件.log`, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
// 设置存储位置
log.SetOutput(logFile)
}
func main() {
log.Println(`今天我学会了输出日志到日志文件`)
log.Println(`然后我就试了一下`)
}
这就是一个函数!
有点神奇啊!
logFile, err := os.OpenFile(`./mylog.txt`, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
log.SetOutput(logFile)
返回的是os.file---->这么可以传参os.writer??????
我i就自己搞一下 OK了
os.OpenFile
logFile, _ := os.OpenFile(`./mylog2.txt`, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
Son_log = zerolog.New(zerolog.ConsoleWriter{Out: logFile, NoColor: false, TimeFormat: time.Stamp}).With().Timestamp().Caller().Logger()