Go语言-log

2023-11-01

1. log包

作为程序调试手段和运行记录,log是非常重要的,现在多数情况下并不是通过某个调试器来进行debug了,而是通过打log的方式观察和调试程序。

可以根据自己的需要实现log功能,Go语言本身也已经内置了log包,这里研究Go语言内置log包的使用方法。

如果习惯看go doc,可以查阅go doc 来快速查阅log包的信息。

1.1 屏显log

屏幕显示即输出log到标准输出设备。

package main

import (
    "log"
)

func main() {
    log.Println("log.Println")
}

---------------
2018/03/29 10:09:20 log.Println

可以看到,直接使用log包,通过log.Println就可以向标准输出打印log,带有日期时间和自定义字符串。可以使用的函数还有print和printf,参考fmt包中的print函数家族的使用方法。

函数 原型
Print func Print(v …interface{})
Println func Println(v …interface{})
Printf func Printf(format string, v …interface{})

Print和Println,其实用起来没有什么区别,连续用log.Print,也并不会输出到同一行,还是每调用一次,就产生新的一行log。

1.2 panic, fatal

log包还提供了两个异常情况的处理函数,panic家族和fatal家族:

函数 原型
Panic func Panic(v …interface{})
Panicln func Panicln(v …interface{})
Panicf func Panicf(format string, v …interface{})
Fatal func Fatal(v …interface{})
Fatalln func Fatalln(v …interface{})
Fatalf func Fatalf(format string, v …interface{})

panic会打印指定的log字符转,然后抛出异常,显示调用栈。

package main

import (
    "log"
)

func main() {
    defer log.Println("log in defer")
    log.Println("log.Println")
    log.Panicln("log.Panicln")
}
---------------
2018/03/29 10:34:27 log.Println
2018/03/29 10:34:27 log.Panicln
2018/03/29 10:34:27 log in defer
panic: log.Panicln


goroutine 1 [running]:
log.Panicln(0xc42003ff50, 0x1, 0x1)
    /home/docker/go192/go/src/log/log.go:340 +0xc0
main.main()
    /home/docker/go/test/log/src/main.go:11 +0x11b
exit status 2

log包中的Panic和系统内置的panic是一样的,运行到log.Panic的时候,打印log信息,然后会继续逆序执行defer,如果存在多级调用,以此返回上级,执行defer,最终打印调用栈。

而Fatal与Panic不同,区别是不会执行defer,也没有调用栈,直接os.Exit(1)了:

package main

import (
    "log"
)

func main() {
    defer log.Println("log in defer")
    log.Println("log.Println")
    log.Fatalln("log.Fatalln")
}
---------------
2018/03/29 10:38:33 log.Println
2018/03/29 10:38:33 log.Fatalln
exit status 1

1.3 设置格式

上面的例子都是用默认的输出格式,每行的最开始显示日期时间,然后显示给定的log内容。
如果需要改变最开始显示的内容,是可以通过设定flag和前缀来完成的。

1.3.1 SetFlags

可以设定的flag包括:

标志 含义
Ldate 日期:2009/01/23
Ltime 时间:01:23:23
Lmicroseconds 微秒分辨率:01:23:23.123123(用于增强Ltime位)
Llongfile 文件全路径名+行号: /a/b/c/d.go:23
Lshortfile 文件无路径名+行号:d.go:23(会覆盖掉Llongfile)
LstdFlags 等于Ldate | Ltime,标准logger的初始值

通过例子看下各个flag的意义:

package main

import (
    "log"
)

func main() {
    log.SetFlags(log.Ldate)
    log.Println("日期")

    log.SetFlags(log.Ltime)
    log.Println("时间")

    log.SetFlags(log.Lmicroseconds)
    log.Println("微秒")

    log.SetFlags(log.Llongfile)
    log.Println("全文件路径和行号")

    log.SetFlags(log.Lshortfile)
    log.Println("文件名和行号")

    log.SetFlags(log.LstdFlags)
    log.Println("标准")

    log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile)
    log.Println("组合: 日期 + 微秒 + 文件名和行号")
}
---------------
2018/03/29 日期
10:54:10 时间
10:54:10.582154 微秒
/home/docker/go/test/log/src/main.go:18: 全文件路径和行号
main.go:21: 文件名和行号
2018/03/29 10:54:10 标准
2018/03/29 10:54:10.582187 main.go:27: 组合: 日期 + 微秒 + 文件名和行号

1.3.2 SetPrefix

上一节设置的flag控制的是最前边显示的时间日期,文件名行号什么的。还可以通过SetPrefix来改变每一行最开始显示的字符串:

package main

import (
    "log"
)

func main() {
    log.SetPrefix("func main")
    log.Println("含前缀")
}
---------------
func main:2018/03/29 10:59:36 含前缀

通过SetFlags和SetPrefix,对log格式的控制,基本可以满足绝大部分的log打印需要了。

1.4 log文件

输出log到文件,可以通过new一些logger,通过logger实例自己的方法调用,去写入不到不同的目标位置。

Logger方法 原型
New func New(out io.Writer, prefix string, flag int) *Logger
Print家族 同log
Panic家族 同log
Fatal家族 同log
SetFlags 同log
SetPrefix 同log
Output func (l *Logger) Output(calldepth int, s string) error

一个最简单的例子:

package main

import (
    "log"
    "os"
)

func main() {
    dbgLog, err := os.OpenFile("./dbgLog.log",  os.O_CREATE | os.O_APPEND| os.O_WRONLY, os.ModePerm)
    if err != nil {
        log.Fatalln("dbgLog.log创建失败")
    }

    errLog, err := os.OpenFile("./errLog.log",  os.O_CREATE | os.O_APPEND| os.O_WRONLY, os.ModePerm)
    if err != nil {
        log.Fatalln("errLog.log创建失败")
    }

    dbgLogger := log.New(dbgLog, "[DEBUG] ", log.LstdFlags)
    errLogger := log.New(errLog, "[ERROR] ", log.LstdFlags|log.Lshortfile)

    log.Println("log文件创建成功")
    dbgLogger.Println("调试信息log")
    errLogger.Println("错误信息log")
}
---------------
2018/03/29 11:15:22 log文件创建成功

---------------
dbgLog.log
[DEBUG] 2018/03/29 11:15:22 调试信息log

---------------
errLog.log
[ERROR] 2018/03/29 11:15:22 main.go:24: 错误信息log

logger不仅可以在New的时候指定Flag,也可以通过与log相同的函数 SetFlags控制log格式,可以通过SetPrefix改变前缀。

对于常规log打印需求,log包已经可以完全满足需要了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言-log 的相关文章

  • 学习笔记(01):go快速入门-iota用法

    立即学习 https edu csdn net course play 26897 344142 utm source blogtoedu
  • go语言使用gin框架

    gin框架基础用法 package main import github com gin gonic gin net http func main router gin Default router LoadHTMLGlob templat
  • Go语言函数

    http www jb51 net article 56831 htm Go语言中的函数有系统函数和自定义函数 1 系统函数 系统函数就是Go语言自带的函数 系统函数一般根据功能封装在不同的包内 比如Print Printf Println
  • go-redis 框架基本使用

    文章目录 redis使用场景 下载框架和连接redis 1 安装go redis 2 连接redis 字符串操作 有序集合操作 流水线 事务 1 普通事务 2 Watch redis使用场景 缓存系统 减轻主数据库 MySQL 的压力 计数
  • 【笔记】2022 Golang+Cobra 学习Cli命令行工具

    github源代码网址 GitHub spf13 cobra A Commander for modern Go CLI interactions 一 安装 由于Cobra更新新的版本 所以网络上之前的教程都需要进行修改 例 根据老的方法进
  • Go语言学习5-切片类型

    切片类型 引言 1 切片 1 1 类型表示法 1 2 值表示法 1 3 属性和基本操作 1 4 切片使用的复杂用法 总结 引言 上篇我们介绍了 Go语言的数组类型 本篇将介绍Go语言的切片类型 主要如下 1 切片 切片可以看作是对数组的一种
  • 微信小程序总结(2)- 需求分析

    在真正进入代码开发之前 很重要的一步就是进行需求分析 用户画像 这款微信小程序的主要用户是谁 是年轻人 中年人 还是老年人 是男生 还是女生 是工薪阶层 还是企业主 是金融理财 还是在线票务 在进行一定范围的样本调查后 可以得出一个精准的用
  • 玩好go的切片

    go的slice 入门就会遇到 但这个东西大多数人都是停留在简单的使用 一些干了好几年的老程序员都说不明白里面的道道 这里面坑不少 恰巧今天有空 好好整理下 永不踩坑 1 为什么要用切片 其他语言大多用的都是数组 在go中 数组的长度是不可
  • go : GoLand安装及环境配置

    前因后果 新学期新气象 开学的第一节课是zw老师的区块链技术与应用领域 congratulations 涉及编程实验 使用Go语言 需要安装GoLand软件进行下一步 Go语言下载地址 golang下载链接 进去之后选择对应的版本下载 这里
  • error An unexpected error occurred: “https://registry.yarnpkg.com/axios: con 解决方案

    error An unexpected error occurred https registry yarnpkg com axios con 今天用在跑一个项目的时候发现了这个错误 看着像是网络连接不上 发现这里是用的Dokcerfile
  • golang的hijack篡取劫持

    一直不太明白golang的hijack是干什么的 只知道hijack这个词是篡取的意思 难道跟网关的作用一样 把client的请求发到这个服务上 然后这个服务帮忙转发到远端server 但是看了源码后就明白这个golang hijack是干
  • Go Web编程实战(2)----流程控制语句

    目录 流程控制语句 if else语句 for循环语句 用for循环实现do while 用for循环实现while break指定跳出循环 continue语句 for range循环 遍历数组 遍历字符串 遍历map 遍历通道 chan
  • GoLang学习资源清单

    地鼠文档go语言文档网站通过收集整理go语言相关的学习文档 为大家提供一个学习平台https www topgoer cn 前景 Go语言中文文档https www topgoer com 文档 Gin Web FrameworkGin W
  • Go timer 是如何被调度的?

    hi 大家好 我是 haohongfan 本篇文章剖析下 Go 定时器的相关内容 定时器不管是业务开发 还是基础架构开发 都是绕不过去的存在 由此可见定时器的重要程度 我们不管用 NewTimer timer After 还是 timer
  • Go开发工具

    http studygolang com articles 1678 1 4 Go开发工具 本节我将介绍几个开发工具 它们都具有自动化提示 自动化fmt功能 因为它们都是跨平台的 所以安装步骤之类的都是通用的 LiteIDE LiteIDE
  • Go语言实现区块链与加密货币-Part1(基本原型、工作量证明、持久化)

    区块链 Blockchain 是21世纪最具革命性的技术之一 它仍然处于不断成长的阶段 而且还有很多潜力尚未显现 作为比特币的底层技术 它本质上只是一个分布式数据库 不过使它独一无二的是 区块链是一个公开的而不是私人的数据库 每个使用它的人
  • 【Go语言核心手册11】context.Context

    往期精选 欢迎转发 如何看待程序员35岁职业危机 Java全套学习资料 14W字 耗时半年整理 我肝了三个月 为你写出了GO核心手册 消息队列 从选型到原理 一文带你全部掌握 肝了一个月的ETCD 从Raft原理到实践 更多 11 1 内容
  • go语言学习 1 -- 类型

    Go语言接受了函数式编程的一些想法 支持匿名函数与闭包 接受了以Erlang语言为代表的面向消息编程思想 支持goroutine和通道 并推荐使用消息而不是共享内存来进行并发编程 总体来说 Go语言是一个非常现代化的语言 精小但非常强大 学
  • Go Web编程实战(6)----反射

    目录 反射 反射的3大原则 接口类型变量 转换为 反射类型对象 反射类型对象 转换为 接口类型变量 反射类型对象 修改 值必 可写的 反射 与其他语言一样 Go语言的反射同样是指 计算机程序在运行时 可以访问 检测和修改它本身状态或行为的一
  • go语言教程哪里有?go 语言优秀开源项目汇总

    目录 监控系统 容器技术 PaaS工具 大数据 微服务 CI CD 数据库技术 存储技术 分布式系统 消息系统 服务器管理 安全工具 网络工具 Web工具 Web框架 区块链技术 其它 监控系统 项目 简介 OpenFalcon OpenF

随机推荐

  • eclipse debug进入.class_用eclipse创建一个java程序

    1 开启Eclipse程序后 首先开始Eclipse中JAVA项目的新建 在上方的选项栏中选择 File New Java Project 系统会弹出新建项目的属性设置 2 在Java Project的设置页面 主要设置project的项目
  • 网狐荣耀手机端内核源码

    网狐荣耀手机端内核源码 实测 可用 链接 https pan baidu com s 1YT GWgFCDxYqrez7e EJqw 提取码 0ezk
  • 因特网(Internet)的概述

    一 因特网的概述 1 主机 连接在因特网上的计算机都称为主机 2 网络 网络 network 由若干节点 node 和连接这些的结点的链路 link 组成 互联网由网络组成 3 Internet和internet的区别 internet 互
  • 线性代数的本质(四)——行列式

    文章目录 行列式 二阶行列式 n n n 阶行列式 行列式的性质 克拉默法则 行列式的几何理解 行列式 二阶行列式 行列式引自对线性方程组的求解 考虑两个方程的二元线性方程组
  • Flask入门教程(3)-表单验证和WTF扩展

    03 01 普通的表单验证 03 02 flash消息闪现 html代码
  • 自顶向下语法分析(top-down parsing)

    自顶向下语法分析 top down parsing 有回溯的自顶向下分析 非预测分析法 无回溯的自顶向下分析 预测分析法 FIRST集和FOLLOW集 两种预测分析算法 LL 1 文法 文法转换 消除左递归 提取左公因子 输入程序经过词法分
  • react-router V6 版本的使用(自己封装了 Redirect,使用 useRoute 等)

    react router V6 版本的使用 自己封装了 Redirect等 IndexRouter js 使用useRoute 做全局路由的搭建 包括嵌套路由 路由重定向 路由拦截 自己封装 路由懒加载 做了一个简单的封装 等 import
  • 五线谱音名和组别对照表_五线谱简谱对照表(五线谱1234567表示图)

    五线谱音阶图 音乐符号是世界上常用的符号 用来记录笔记的五行平行线称为谱线 工作人员有5条线 在这5条线中有4个房间 每行和每个房间上方都有一个音符 五条线和四个房间是不够的 并且可以添加其他房间和线 在学习职员记号之后 将始终使用它 因为
  • 入职华为外包一个月后,我离职向“北上广深”流浪了...

    这次来聊一个大家可能也比较关心的问题 那就是就业城市选择的问题 而谈到这个问题 就不可避免地会谈到一些关于 机会 技术氛围 跳槽 薪资水平 等等一系列问题 正好 这也是大家所常问的 我只能说来聊聊我的感受吧 我觉得城市选择非常重要 尤其对我
  • 链表大小排序方法c语言,5 种排序算法--C语言链表

    源码地址 GitHub https github com GYT0313 C DataStructure blob master sortIn5 c 包括 冒泡排序 快速排序 选择排序 插入排序 希尔排序 运行 注意 快速排序的核心代码应该
  • C#中属性赋值的步骤以及语法详解

    首先我们要先知道什么是C C 是由微软 Microsoft 开发 其中还包括C 面向过程 C C 是一个简单的 现代的 通用的 面向对象的编程语言 面向对象 是一种解决问题的思想 那么什么是对象 在程序员的眼中自己身边万物都可以理解为对象
  • python运行js文件_python-execjs(调用js)

    一 安装 pip3 install PyExecJS 电脑上要有nodejs环境 二 使用 一 获取js字符串 首先将js保存至于本地文件或者你可以可以直接读到内存 必须让js以python基础教程字符串的形式展示 注意点 字符串中不要出现
  • Go 获取10分钟前的时间,一天前的时间。。。

    time Now Add time Minute 10 golang的time包里面有个AddDate方法 nTime time Now yesTime nTime AddDate 0 0 1 logDay yesTime Format 2
  • FireFox浏览器的about:config参数大全及其具体用途介绍

    FireFox浏览器的about config参数大全及其具体用途介绍 注意 这还远不是所有的about config参数 由于设置参数太多 官方也只提供英文版本的说明 这里提供的FireFox about config配置参数并不完整 希
  • MSP430F5529学习笔记(4)——按键点灯

    MSP430F5529学习笔记 3 实现LED闪烁和呼吸灯 独立按键工作原理 目录 按键扫描 原理图分析 写程序 按下s1点亮LED1 1 首先我们需要告诉单片机 P2 1是输入还是输出 2 配置IO是否允许上下拉 3 配置IO是上拉还是下
  • 入坑前端:一文搞懂 Flex 布局

    前言 Flex 这个布局前前后后看了3次 第一次学的时候 发现有十几个属性值没耐心看完就没往下学了 作罢 第二次去看的时候大概搞明了Flex每个属性的用法 可没过几天又全部忘光了 第三次了解 Flex 于是就有了这篇笔记 估计是全网最易懂的
  • MyBatis 特殊字符转义拦截器 针对(_、\、%)

    一 问题反馈 今天公司测试向我反馈 系统用户模糊查询功能在用户名称包含特殊字符时 无法正常查询结果 二 问题验证 1 当like中包含 时 查询仍为全部 即 like 查询出来的结果与like 一致 并不能查询出实际字段中包含有 特殊字符的
  • 构建Camel和Raspberry Pi物联网

    该项目基于Camel技术 项目为IoT社区提供了一些很棒的新东西 这些东西是将电子设备 i2c SPI gpio tinkerforge 和云 pubnub cloudlet mqtt 连接在一起的新的物联网组件 在本实验中 我们将展示如何
  • 卡特兰数——括号匹配问题

    卡特兰数的递推公式是F n k 1 n F k 1 F n k k 0 n 1 F k F n k 1 一般性公式为F n C 2n n n 1 可以描述的问题有 1 n个元素的二叉查找树有多少种 2 n n棋盘从左下角走到右上角而不穿过主
  • Go语言-log

    1 log包 作为程序调试手段和运行记录 log是非常重要的 现在多数情况下并不是通过某个调试器来进行debug了 而是通过打log的方式观察和调试程序 可以根据自己的需要实现log功能 Go语言本身也已经内置了log包 这里研究Go语言内