Go日志系统

上一篇文章基本是炮灰

准备高性能

开始 GitHub - rs/zerolog: Zero Allocation JSON Logger

遇到同样的问题 我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")

}

研究过程:

https://blog.csdn.net/weixin_33802505/article/details/85991356

类似这个文章 很多

直接去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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值