添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接


Go日志库——log和logrus

1.Log库

在日常开发中,日志是必不可少的功能。虽然有时可以用​ ​fmt​ ​​库输出一些信息,但是灵活性不够。Go 标准库提供了一个日志库​ ​log​ ​。

​log​ ​​默认输出到标准错误(​ ​stderr​ ​​),每条日志前会自动加上日期和时间。如果日志不是以换行符结尾的,那么​ ​log​ ​会自动加上换行符。即每条日志会在新行中输出。

​log​ ​提供了三组函数:

  • ​Print/Printf/Println​ ​:正常输出日志;
  • ​Panic/Panicf/Panicln​ ​​:输出日志后,以拼装好的字符串为参数调用​ ​panic​ ​;
  • ​Fatal/Fatalf/Fatalln​ ​​:输出日志后,调用​ ​os.Exit(1)​ ​退出程序。

命名比较容易辨别,带​ ​f​ ​​后缀的有格式化功能,带​ ​ln​ ​后缀的会在日志后增加一个换行符。

选项

// src/log/log.go
const (
Ldate = 1 << iota
Ltime
Lmicroseconds
Llongfile
Lshortfile
LUTC
)

设置选项可在每条输出的文本前增加一些额外信息,如日期时间、文件名等。

​log​ ​库提供了 6 个选项:

  • ​Ldate​ ​​:输出当地时区的日期,如​ ​2020/02/07​ ​;
  • ​Ltime​ ​​:输出当地时区的时间,如​ ​11:45:45​ ​;
  • ​Lmicroseconds​ ​​:输出的时间精确到微秒,设置了该选项就不用设置​ ​Ltime​ ​​了。如​ ​11:45:45.123123​ ​;
  • ​Llongfile​ ​​:输出长文件名+行号,含包名,如​ ​github.com/darjun/go-daily-lib/log/flag/main.go:50​ ​;
  • ​Lshortfile​ ​​:输出短文件名+行号,不含包名,如​ ​main.go:50​ ​;
  • ​LUTC​ ​​:如果设置了​ ​Ldate​ ​​或​ ​Ltime​ ​,将输出 UTC 时间,而非当地时区。

调用​ ​log.SetFlag​ ​设置选项,可以一次设置多个:

package main

import (
"log"
)

type User struct {
Name string
Age int
}

func main() {
u := User{
Name: "dj",
Age: 18,
}

log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds)

log.Printf("%s login, age:%d", u.Name, u.Age)
}

​log.New​ ​接受三个参数:

  • ​io.Writer​ ​​:日志都会写到这个​ ​Writer​ ​中;
  • ​prefix​ ​​:前缀,也可以后面调用​ ​logger.SetPrefix​ ​设置;
  • ​flag​ ​​:选项,也可以后面调用​ ​logger.SetFlag​ ​设置。

上面代码将日志输出到一个​ ​bytes.Buffer​ ​​,然后将这个​ ​buf​ ​打印到标准输出。

注意到,第一个参数为​ ​io.Writer​ ​​,我们可以使用​ ​io.MultiWriter​ ​​实现多目的地输出。下面我们将日志同时输出到标准输出、​ ​bytes.Buffer​ ​和文件中

package main

import (
"bytes"
"io"
"log"
"os"
)

type User struct {
Name string
Age int
}

func main() {
u := User{
Name: "dj",
Age: 18,
}

writer1 := &bytes.Buffer{}
writer2 := os.Stdout
writer3, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("create file log.txt failed: %v", err)
}

logger := log.New(io.MultiWriter(writer1, writer2, writer3), "", log.Lshortfile|log.LstdFlags)
logger.Printf("%s login, age:%d", u.Name, u.Age)
}

总结

go的官方log库提供了三种级别的日志,支持自定义,输出日期、时间、长短文件名+行号和信息。

2.Logrus库

​logrus​ ​​完全兼容标准的​ ​log​ ​库,还支持文本、JSON 两种日志输出格式。

第三方库需要先安装:

$ go get github.com/sirupsen/logrus

后使用:

package main

import (
"github.com/sirupsen/logrus"
)

func main() {
logrus.SetLevel(logrus.TraceLevel)

logrus.Trace("trace msg")
logrus.Debug("debug msg")
logrus.Info("info msg")
logrus.Warn("warn msg")
logrus.Error("error msg")
logrus.Fatal("fatal msg")
logrus.Panic("panic msg")
}

​*logrus*​ ​​的使用非常简单,与标准库​ ​log​ ​​类似。​ ​*logrus*​ ​支持更多的日志级别:

  • ​Panic​ ​​:记录日志,然后​ ​panic​ ​。
  • ​Fatal​ ​:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出;
  • ​Error​ ​:错误日志,需要查看原因;
  • ​Warn​ ​:警告信息,提醒程序员注意;
  • ​Info​ ​:关键操作,核心流程的日志;
  • ​Debug​ ​:一般程序中输出的调试信息;
  • ​Trace​ ​:很细粒度的信息,一般用不到;

日志级别从上向下依次增加,​ ​Trace​ ​​最大,​ ​Panic​ ​​最小。​ ​*logrus*​ ​​有一个日志级别,高于这个级别的日志不会输出。
默认的级别为​​ ​InfoLevel​ ​​。所以为了能看到​ ​Trace​ ​​和​ ​Debug​ ​​日志,我们在​ ​main​ ​​函数第一行设置日志级别为​ ​TraceLevel​


功能

支持输出日期、时间、文件名、添加字段、重定向输出、自定义日志格式、设置钩子hook。详情见参考文章2

3.参考文章

​log文章​

​logrus文章​


java 不用aop 在所有方法执行前后都执行一些方法

前言这里介绍在Scala中,包和引入的相关操作。 会与Java作对比。1. 将代码放入包中如果你看过前面的章节会知道,所有的示例代码中都是从object 对象开始。 这里,使用包的形式。 如:package gyt.navigation class Navigator如Java一样,如果你的包名是网站,建议倒着写。 另外一种类型C#的命名空间的做法,称为打包。如:package gyt.navig

Redis:内存数据库,基于键值对的缓存与储存系统,可以胜任消息队列,任务队列等不同的角色。 速度之快:在一台普通的笔记本电脑上,Redis可以再1S内读取超锁10W看key-value。 特点:程序退出后,内存中的数据库会丢失,Redis提出了对持久化的支持,可以将内存中数据写入到磁盘。 Redis默认支持16个数据库,Redis会自动选择0

3.2024-10-16:用go语言,找出一个字符串中每个字符最多出现两次的最长子串,并返回该子串的最大长度。 输入: s = “bcbbbcba“。 输出: 4。 解释: 以下子字符串长度为 4,并且每 4.AIGC工具的使用测评 5.MYSQL列转行