查看基本使用:

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.Panicfpanic,所以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:如果设置了LdateLtime,将输出 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的更多相关文章

  1. C++ 日志库 boost::log 以及 glog 的对比

    日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...

  2. golang 日志模块(log)

    log 日志 log 模块可以自定义log 对象, 也可以使用log默认对象的日志方法 func New 创建log对象 func New(out io.Writer, prefix string, ...

  3. golang日志库之glog使用问题总结

    1. 日志默认输出路径为临时路径,可通过执行命令时带上 -log_dir="路径",指定输出,但路径必须已存在,源码如下,日志文件会生成两个 .INFO等后缀是符号链接文件,另一个 ...

  4. Golang 标准库log的实现

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

  5. golang常用库包:log日志记录-uber的Go日志库zap使用详解

    Go 日志记录库:uber-go 的日志操作库 zap 使用 一.简介 zap 是 uber 开源的一个高性能,结构化,分级记录的日志记录包. go1.20.2 zap v1.24.0 zap的特性 ...

  6. golang常用库:日志记录库-logrus使用

    介绍 logrus 它是一个结构化.插件化的日志记录库.完全兼容 golang 标准库中的日志模块.它还内置了 2 种日志输出格式 JSONFormatter 和 TextFormatter,来定义输 ...

  7. Golang:手撸一个支持六种级别的日志库

    Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...

  8. Golang一日一库之 日志库 zap

    简介 在开发过程中 会使用到日志库去记录错误的日志,尤其是golang中 有无穷无尽的error 如果不记录,当你的代码出错,就无从排错了. zap 是开源的 Go 高性能日志库 主要有以下特点: 支 ...

  9. C/C++log日志库比较

    事实上,在C的世界里面没有特别好的日志函数库(就像Java里面的的log4j,或者C++的log4cxx).C程序员都喜欢用自己的轮子.printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者 ...

  10. [译]如何禁止Requests库的log日志信息呢?

    原文来源: https://stackoverflow.com/questions/11029717/how-do-i-disable-log-messages-from-the-requests-l ...

随机推荐

  1. 傅里叶级数 傅里叶变换 FFT 时域 频域 功率谱 能量谱 功率谱密度PSD

    傅立叶级数是基于周期函数的,如果我们把周期推广到

  2. FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架

    ​很多程序员想学习音视频的编程开发,却不知从何学习,因为音视频技术的体系庞大.知识杂糅,一眼望去就令人生怯.那么学习音视频建议站在前人的肩膀上,从优秀的音视频开源框架开始钻研,先熟悉这些开源工具的具体 ...

  3. 关于.NET在中国为什么工资低的分析

    引言 近年来,随着软件开发行业的蓬勃发展,越来越多的编程语言和框架进入了市场,成为了不同类型软件开发项目的首选工具.然而,在中国的开发者社区中,.NET 开发人员的工资水平相比其他技术栈,如 Java ...

  4. Angular 18+ 高级教程 – 学以致用

    前言 读这么多原理,到底为了什么?真实项目中真的会用得到吗? 你正在疑惑 "知识的力量" 吗? 本篇会给一个非常非常好的案例,让你感悟 -- 知识如何用于实战. 记住,我的目的是让 ...

  5. mongo 副本集rs 理解和使用小结

    转载请注明出处: 在MongoDB中,rs(通常指的是"replica set"的缩写)是复制集(Replica Set)的标识符或在使用时的一种常见前缀,尤其是在命令行工具和脚本 ...

  6. C++ STL map/multimap容器

    map/multimap容器 Map的特性是,所有元素都会根据元素的键值自动排序.Map所有的元素都是pair,同时拥有实值和键值,pair的第一个元素被视为键值,第二个元素被视为实值,map不允许两 ...

  7. SuperMap iManager for K8S 删除旧环境修改NFS地址流程

    一.完整删除SuperMap iManager 找到SuperMap iManager安装目录,执行: ./shutdown.sh -v 二.修改NFS存储路径 有两种办法,一种是直接修改/etc/e ...

  8. nginx缓存加速笔记

    目录 1 服务端缓存原理 1.1 定义一个缓存目录 1.2 启用缓存 1.3 Nginx 作反代 1.4 缓存一时爽,全家火葬场. 1.5 ngx_cache_purge 1 服务端缓存原理 主要是缓 ...

  9. ASP.NET实现网站发布及跨域访问

    1.软件下载及安装 visual studio 2012 or 2013 启用电脑IIS配置 2.网页编写及排版 在visual studio中创建web项目添加aspx页面(个人网页:和html差不 ...

  10. USACO 2023 December Contest, Gold

    Problem 1. Flight Routes 设原图的邻接矩阵为 \(e\),考虑它给我们的矩阵是什么东西. 设 \(d_{i, j}\) 表示 \(i\) 到 \(j\) 的路径数的奇偶性,那么 ...