博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang学习日志 ━━ log用法及注意使用条件,否则可能导致关闭程序
阅读量:4116 次
发布时间:2019-05-25

本文共 3393 字,大约阅读时间需要 11 分钟。

之前做了一个爬虫,有一部分提示没有用fmt.Print()打印,而是用了log库,结果一遇到错误就直接关闭了。。。查了很久都没查到原因,最终发现是log.Fatal()搞的鬼,一声叹息。这里整理了一下log的资料,好好复习一下。

错误一般会有两种:

  • 一种是确实影响到了程序后面的执行,前后关联性比较强;
  • 一种是程序关联性并不强,当前的执行不成功或报错并不影响后面的执行,或者该错误并不会影响正常输出的结果。

遇到后者时,大部分时候(比如,进行for 死循环进行c/s交互时,因为网络短时中断或其他原因,暂时出错,实际我们是不希望程序退出的,还是希望循环继续,等待网络恢复后,程序继续)我们还是希望程序继续执行的。

比如下面这个例子:

func main(){
url := []string{
"http://www.bucunzaidedizhi.com","http://www.163.com"} for _,u := range url{
go parseUrl(u) }}func parseUrl(url string){
res, err := http.Get(url) defer res.Body.Close() if err != nil {
log.Fatal(err) return } // ...更多操作 }

如果url页面打不开,那么http.Get()就会返回一个err错误,但这里使用了log.Fatal()来显示错误,于是程序越过return,也越过defer,直接退出程序,这样第一个网址解析不出来就退出程序,导致第二个网址也没法正常执行了。

在这里插入图片描述
上面说明的比较清楚吧,使用log.Fatallog.Panic 相关的函数时,会调用os.Exit(1)退出程序。遇到这种情况怎么办呢?如果依旧使用log库,那么换用 log.Print即可,该函数在输出日志的时候并不会调用os.Exit 进行退出。

1、log简介

golang内置了log包,实现简单的日志服务。通过调用log包的函数,可以实现简单的日志打印功能。

2、log使用

log包中有3个系列的日志打印函数,分别print系列panic系列fatal系列

函数系列 作用
print、println、printf 单纯打印日志
panic、panicln、panicf 打印日志,抛出panic异常
fatal、fatalln、fatalf 打印日志,强制结束程序(os.Exit(1)),defer函数不会执行

简单示例

func main() {
defer fmt.Println("panic退出前处理") log.Println("println日志") log.Panic("panic日志") log.Fatal("程序退出日志")}

结果示例(实际结果不是这样的哦,因为panic,fatal会影响程序的执行):

2020/06/02 11:04:17 println日志2020/06/02 11:04:17 panic日志2020/06/02 11:04:17 panic退出前处理2020/06/02 11:04:17 程序退出日志

3、log配置

3.1 标准log配置

默认情况下log只会打印出时间,但是实际情况下我们可能还需要获取文件名,行号等信息,log包提供给我们定制的接口。

log包提供两个标准log配置的相关方法:

func Flags() int  // 返回标准log输出配置func SetFlags(flag int)  // 设置标准log输出配置

flag参数

const (    // 控制输出日志信息的细节,不能控制输出的顺序和格式。    // 输出的日志在每一项后会有一个冒号分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message    Ldate         = 1 << iota     // 日期: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)    LUTC                          // 使用UTC时间    LstdFlags     = Ldate | Ltime // 标准logger的初始值)

标准日志配置示例

func init()  {
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)}func main() {
log.Println("println日志")}

输出结果:

在这里插入图片描述

3.2 日志前缀配置

log包提供两个日志前缀配置的相关函数:

func Prefix() string  // 返回日志的前缀配置func SetPrefix(prefix string)  // 设置日志前缀

日志前缀配置实例

func init()  {
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) log.SetPrefix("success")}func main() {
log.Println("println日志")}

输出结果:

在这里插入图片描述

3.3 日志输出位置配置

前面介绍的都是将日志输出到控制台上,golang的log包还支持将日志输出到文件中。log包提供了func SetOutput(w io.Writer)函数,将日志输出到文件中。

日志输出位置配置

func init()  {
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) logFile, err := os.OpenFile("./c.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil {
log.Panic("打开日志文件异常") } log.SetOutput(logFile)}func main() {
log.Println("println日志")}

结果:日志输出到当前目录下c.log文件中

在这里插入图片描述

4、自定义logger

log包为我们提供了内置函数,让我们能自定义logger。从效果上来看,就是将标题3中的标准日志配置、日志前缀配置、日志输出位置配置整合到一个函数中,使日志配置不在那么繁琐。

log包中提供了func New(out io.Writer, prefix string, flag int) *Logger函数来实现自定义logger。

示例

var logger *log.Loggerfunc init()  {
logFile, err := os.OpenFile("./c.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil {
log.Panic("打开日志文件异常") } logger = log.New(logFile, "success", log.Ldate | log.Ltime | log.Lshortfile)}func main() {
logger.Println("自定义logger")}

参考:

转载地址:http://exkpi.baihongyu.com/

你可能感兴趣的文章
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>
Tomcat启动错误,端口占用
查看>>
laravel 修改api返回默认的异常处理
查看>>
高德坐标转换百度坐标 javascript
查看>>
tp5封装通用的修改某列值
查看>>
laravel控制器与模型名称不统一
查看>>
vue登录拦截
查看>>
npm配置淘宝镜像仓库以及electron镜像
查看>>
linux设置开机自启动脚本的最佳方式
查看>>
VUE SPA 单页面应用 微信oauth网页授权
查看>>
phpstorm 集成 xdebug 进行调试
查看>>
npm和node升级的正确方式
查看>>
laravel事务
查看>>
springcloud 连续请求 500
查看>>
vue复用新增和编辑表单
查看>>
Ubuntu 16.04 apt-get更换为国内阿里云源
查看>>
laravel部署到宝塔步骤
查看>>
小程序获取access_token
查看>>
navicat远程连接mysql数据库
查看>>
tp5令牌数据无效 解决方法
查看>>