golang日志库之log
查看基本使用:
package main import (
"log"
) type User struct {
Name string
Age int
} func main() {
u := User{
Name: "dj",
Age: 18,
} log.Printf("%s login, age:%d", u.Name, u.Age)
log.Panicf("Oh, system error when %s login", u.Name)
log.Fatalf("Danger! hacker %s login", u.Name)
}
log默认输出到标准错误(stderr),每条日志前会自动加上日期和时间。如果日志不是以换行符结尾的,那么log会自动加上换行符。即每条日志会在新行中输出。
log提供了三组函数:
Print/Printf/Println:正常输出日志;Panic/Panicf/Panicln:输出日志后,以拼装好的字符串为参数调用panic;Fatal/Fatalf/Fatalln:输出日志后,调用os.Exit(1)退出程序。
命名比较容易辨别,带f后缀的有格式化功能,带ln后缀的会在日志后增加一个换行符。
注意,上面的程序中由于调用log.Panicf会panic,所以log.Fatalf并不会调用。
前缀:
调用log.SetPrefix为每条日志文本前增加一个前缀。例如,在上面的程序中设置Login:前缀:
package main import (
"log"
) type User struct {
Name string
Age int
} func main() {
u := User{
Name: "dj",
Age: 18,
} log.SetPrefix("Login: ")
log.Printf("%s login, age:%d", u.Name, u.Age)
}
选项flag:
设置选项可在每条输出的文本前增加一些额外信息,如日期时间、文件名等。
log库提供了 6 个选项:
const (
Ldate = 1 << iota
Ltime
Lmicroseconds
Llongfile
Lshortfile
LUTC
)
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 时间,而非当地时区。
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.Flags()可以获取当前设置的选项。
log库还定义了一个Lstdflag,为Ldate | Ltime,这就是我们默认的选项。
const (
LstdFlags = Ldate | Ltime
)
log.New接受三个参数:
io.Writer:日志都会写到这个Writer中;prefix:前缀,也可以后面调用logger.SetPrefix设置;flag:选项,也可以后面调用logger.SetFlag设置。
注意到,第一个参数为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)
}
自定义日志包:
logfer/logger.go
package logger
import (
"io"
"log"
"os"
)
const (
flag = log.Ldate | log.Ltime | log.Lshortfile
preDebug = "[DEBUG]"
preInfo = "[INFO]"
preWarn = "[WARN]"
preError = "[ERROR]"
)
var (
logFile io.Writer
debugLogger *log.Logger
infoLogger *log.Logger
warnLogger *log.Logger
errorLogger *log.Logger
defaultLogFile = "web.log"
)
func init(){
var err error
logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
defaultLogFile = "./web.log"
logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
log.Fatalf("create log file err %+v", err)
}
}
debugLogger = log.New(logFile, preDebug, flag)
infoLogger = log.New(logFile, preInfo, flag)
warnLogger = log.New(logFile, preWarn, flag)
errorLogger = log.New(logFile, preError, flag)
}
func Debugf(format string, v ...interface{}){
debugLogger.Printf(format, v...)
}
func Infof(format string, v ...interface{}){
infoLogger.Printf(format, v...)
}
func Warnf(format string, v ...interface{}){
warnLogger.Printf(format, v...)
}
func Errorf(format string, v ...interface{}){
errorLogger.Printf(format, v...)
}
func SetOutputPath(path string) {
var err error
logFile, err = os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
if err != nil {
log.Fatalf("create log file err %+v", err)
}
debugLogger = log.New(logFile, preDebug, flag)
infoLogger = log.New(logFile, preInfo, flag)
warnLogger = log.New(logFile, preWarn, flag)
errorLogger = log.New(logFile, preError, flag)
}
使用方式:
errStr := "this is a error"
logger.Debugf("hello, %s", errStr)
logger.Infof("hello, %s", errStr)
logger.Warnf("hello, %s", errStr)
logger.Errorf("hello, %s", errStr)
golang日志库之log的更多相关文章
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
- golang 日志模块(log)
log 日志 log 模块可以自定义log 对象, 也可以使用log默认对象的日志方法 func New 创建log对象 func New(out io.Writer, prefix string, ...
- golang日志库之glog使用问题总结
1. 日志默认输出路径为临时路径,可通过执行命令时带上 -log_dir="路径",指定输出,但路径必须已存在,源码如下,日志文件会生成两个 .INFO等后缀是符号链接文件,另一个 ...
- Golang 标准库log的实现
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1406905 前 ...
- golang常用库包:log日志记录-uber的Go日志库zap使用详解
Go 日志记录库:uber-go 的日志操作库 zap 使用 一.简介 zap 是 uber 开源的一个高性能,结构化,分级记录的日志记录包. go1.20.2 zap v1.24.0 zap的特性 ...
- golang常用库:日志记录库-logrus使用
介绍 logrus 它是一个结构化.插件化的日志记录库.完全兼容 golang 标准库中的日志模块.它还内置了 2 种日志输出格式 JSONFormatter 和 TextFormatter,来定义输 ...
- Golang:手撸一个支持六种级别的日志库
Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...
- Golang一日一库之 日志库 zap
简介 在开发过程中 会使用到日志库去记录错误的日志,尤其是golang中 有无穷无尽的error 如果不记录,当你的代码出错,就无从排错了. zap 是开源的 Go 高性能日志库 主要有以下特点: 支 ...
- C/C++log日志库比较
事实上,在C的世界里面没有特别好的日志函数库(就像Java里面的的log4j,或者C++的log4cxx).C程序员都喜欢用自己的轮子.printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者 ...
- [译]如何禁止Requests库的log日志信息呢?
原文来源: https://stackoverflow.com/questions/11029717/how-do-i-disable-log-messages-from-the-requests-l ...
随机推荐
- 使用 Microsoft.Extensions.ServiceDiscovery 进行服务发现并调用
简介 在现代微服务架构中,服务发现(Service Discovery)是一项关键功能.它允许微服务动态地找到彼此,而无需依赖硬编码的地址.以前如果你搜 .NET Service Discovery, ...
- CSS – W3Schools 学习笔记 (1)
CSS Color Link to W3Schools 这里讲的是 color 的 value, 它可以用在许多属性上, 比如 background-color, color, border-colo ...
- SpringBoot 集成 LDAP
LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式 LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等 openLDAP部 ...
- /proc/sys/vm 使用
这些参数主要是用来调整virtual memory子系统的行为以及数据的写出(从RAM到ROM). 这些节点(参数)的默认值和初始化的过程大部分都可以在mm/swap.c中找到. 目前,/proc/s ...
- Fio工具详解【强大的IO性能压测工具】
Fio压测工具操作 fio -name=iouring_test -filename=/mnt/vdd/testfile -iodepth=128 -thread -rw=randread -ioen ...
- 对抗生成网络(GAN)简单介绍
对抗生成网络主要由生成网络和判别网络构成,GAN在图像领域使用较多.利用生成网络生成假的图像,然后利用判别器是否能判断该图像是假的. 1.用于医学图像分割,一般我们可以利用一个U-Net网络生成分割结 ...
- otdolist 案例
1. 渲染默认任务 2. 回车添加任务 3. 删除任务 4. 底部任务数量 5. tab栏切换 6. tab切换显示不同任务 7. 清除已完成的任务 8. 头部全选 9. 删除任务
- DIY Matter Bridge 和智能锁简单联动的实践
一. 写在前面 在之前的博客文章 <基于乐鑫 ESP32-C3 的 Matter Light 实践>中,我们利用乐鑫的硬件和 SDK 方案实现了简单的 Light 例程,并对 Matter ...
- 云原生周刊:K8s v1.28 中的结构化身份验证配置
开源项目推荐 KubeLinter KubeLinter 是一种静态分析工具,用于检查 Kubernetes YAML 文件和 Helm 图表,以确保其中表示的应用程序遵循最佳实践. DB Opera ...
- 数据库系统原理——第三章 关系数据库标准语言SQL
@ 目录 1.SQL的特点 2.SQL的组成 3SQL语句 3.1数据库的基本操作 3.2 基本表的定义.修改.删除 3.3索引的建立与删除 3.4数据更新 3.5数据查询 3.5.1单表查询 3.5 ...