文档章节

how to write log

txgcwm
 txgcwm
发布于 2017/06/06 18:07
字数 837
阅读 6
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

程序中记录日志的首要目的就是Troubleshooting,通过记录程序中对外部系统与模块的依赖调用、重要状态信息的变化、关键变量、关键逻辑等,显示基于时间轴的程序运行轨迹,显示业务是否正常、是否存在非预期执行,在出问题时方便还原现场,推断程序运行过程、理清问题的方向。

#基础

##后台输出

package main

import (
	"fmt"
)

func main(){
	fmt.Println("------hello world-----")
}

##There are no exceptions in Golang, only errors.

Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常,替代方案是使用多值返回来返回错误。当然Go并不是全面否定异常的存在,或者用recover+panic语法实现,只是极力不鼓励多用异常。

package main

import (
	"log"
	"errors"
	"fmt"
)

func main() {
	/* local variable definition */
	// ...

	/* function for division which return an error if divide by 0 */
	ret,err = div(a, b)
	if err != nil {
		log.Fatal(err)
    	}
    	
    	fmt.Println(ret)
}

##写入日志文件:

package main

import (
	"log"
	"os"
)

func main(){
	f,err :=os.OpenFile("test.log",os.O_WRONLY|os.O_CREATE|os.O_APPEND,0644)
	if err !=nil{
		log.Fatal(err)
  	}
 
 	defer f.Close()
 	log.SetOutput(f)
	log.Println("==========works==============")
}
$ more test.log
2017/05/24 21:46:25 ==========works==============

#格式化

推荐日志工具库:logrus

$ go get github.com/Sirupsen/logrus

##JSON format

package main

import (
	log "github.com/Sirupsen/logrus"
	"github.com/logmatic/logmatic-go"
)

func main() {
	// use JSONFormatter
	log.SetFormatter(&logmatic.JSONFormatter{})
	// log an event as usual with logrus
	log.WithFields(log.Fields{"string": "foo", "int": 1, "float": 1.1 }).Info("My first ssl event from golang")
}

日志输出样式:

{
	"@marker":["sourcecode","golang"],
	"date":"2017-05-24T15:27:40+08:00",
	"float":1.1,"int":1,"level":"info",
	"message":"My first ssl event from golang",
	"string":"foo"
}

##附加上下文

通过logrus库可以加入一些上下文信息,例如:主机名称,程序名称或者会话参数等。

contextLogger := log.WithFields(log.Fields{
	"common": "XXX common content XXX",
	"other": "YYY special context YYY",
})

contextLogger.Info("AAAAAAAAAAAA")
contextLogger.Info("BBBBBBBBBBBB")

日志输出样式:

$ go run LogMatic.go
{"@marker":["sourcecode","golang"],"common":"XXX common content XXX","date":"2017-05-24T17:00:08+08:00","level":"info","message":"AAAAAAAAAAAA","other":"YYY special context YYY"}
{"@marker":["sourcecode","golang"],"common":"XXX common content XXX","date":"2017-05-24T17:00:08+08:00","level":"info","message":"BBBBBBBBBBBB","other":"YYY special context YYY"}

##Hooks

我们还可以利用Hook机制实现日志功能扩展,例如Syslog hook,将输出的日志发送到指定的Syslog服务。

package main

import (
	log "github.com/sirupsen/logrus"
	"gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "aibrake"
	logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
	"log/syslog"
)

func main(){
	hook, err := logrus_syslog.NewSyslogHook("udp", "59.37.0.1:514", syslog.LOG_INFO, "")
	if err != nil {
		log.Error("Unable to connect to local syslog daemon")
	} else {
		log.AddHook(hook)
	}
}

验证是否发送Syslog

$ sudo tcpdump | grep 59.37.0.1
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes
18:51:05.663612 IP 192.168.199.15.58819 > 59.37.0.1.syslog: SYSLOG kernel.info, length: 314
18:51:05.663657 IP 192.168.199.15.58819 > 59.37.0.1.syslog: SYSLOG kernel.info, length: 314

##可视化

在真实场景中日志数据体量非常庞大,日志存储只是第一步,更多的情况是需要查看特定指标或者能够快速检索信息,此时日志分析平台就发挥作用了。以logmatic为例,可以在它的官网注册https://logmatic.io/,免费体验。

在使用logmatic之前,需要下载它的hook支持:

$ go get github.com/logmatic/logmatic-go
func main() {
	// instantiate a new Logger with your Logmatic APIKey
	// 国内访问比较慢
	log.AddHook(logmatic.NewLogmaticHook("p53uTkOhSEqI3-116DynkQ"))

	// ..........
}

© 著作权归作者所有

上一篇: c语言经典书籍
下一篇: 互联网中文博客
txgcwm

txgcwm

粉丝 5
博文 4
码字总数 3310
作品 0
杭州
高级程序员
私信 提问
MySQL:MGR 学习(2):Write set(写集合)的写入过程

水平有限,有误请谅解。 源码版本5.7.22 一、前文总结 前文 MySQL:MGR 学习(1):写集合(Write set) 中 已经说明了Write set的生成过程,但是Write set是需要封装如下Transactioncontextlogev...

重庆八怪
2018/09/17
0
0
MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数

InnoDB在设计lock-free的log system时,除了已有的参数外,还通过宏控制隐藏了一些参数,如果你使用源码编译时,打开cmake选项-DENABLEEXPERIMENTSYSVARS=1, 就可以看到这些参数了。本文主要...

zhaiwx_yinfeng
05/26
0
0
php使用smtp.sina.com邮箱发送邮件

需要写一个smtp发送类 测试sina邮箱可否使用 使用 测试可用。感谢原作者分享。

不避风云
2015/12/15
388
0
最新用的PHP mysql类

} ?> /* 用法: 连接$db=new DB($dbhost, $dbuser, $dbpw, $dbname); *** 查询:get_one($sql); 查一条记录get_row($sql); 查一条记录 (习惯用这个名) get_all($sql); 查多条记录get_rows(......

史帝文
2016/06/01
71
0
log file sync 等待超高一例子

这是3月份某客户的情况,原因是服务器硬件故障后进行更换之后,业务翻译偶尔出现提交缓慢的情况。我们先来看下awr的情况。 我们可以看到,该系统的load profile信息其实并不高,每秒才21个t...

rudy_gao
2015/05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

web前端入门到实战:图解原生dialog标签(非常详细)

在html5中,新增了很多语义化的标签。如footer、header之类的,今天的主角是dialog标签 顾名思义,就是用来定义对话框的。目前只有Chrome和Safari支持该标签,所以用的不多,不过确实挺好用的...

梦想编程
28分钟前
4
0
一些php常用函数积累

本文链接<?php// id: ecffe70d3af54df9bad97b61918ace7d global $ct_path, $ct_log_path;$log_path = "test_php.txt";// 是否先log到buffer,再通过CT_flush()一次性写入文件$......

一字见心
29分钟前
4
0
IntelliJ idea中 注释代码折叠

visual studio中有#region 可以折叠代码,IntelliJ idea 中也有类似功能 //region 描述代码//endregion

format
29分钟前
5
0
oracle表中更改主键

一、数据表有主键但无主键约束名 先删除之前的主键,后添加主键 ,执行SQL: a. alter table 表名 drop primary key; b. alter table 表名 add primary key(想要更改的字段名称); 二、数据表...

_Somuns
30分钟前
4
0
jQuery AJAX提交表单

我有一个名称为orderproductForm的表单,输入的数量不确定。 我想做某种jQuery.get或ajax或类似的事情,它将通过Ajax调用页面,并发送所有形式为orderproductForm的输入。 我想一种方法是做类...

技术盛宴
36分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部