摘要
程序中记录日志的首要目的:Troubleshooting。通过记录程序中对外部系统与模块的依赖调用、重要状态信息的变化、关键变量、关键逻辑等,显示基于时间轴的程序运行轨迹,显示业务是否正常、是否存在非预期执行,在出问题时方便还原现场,推断程序运行过程、理清问题的方向。
本文将讨论在实现日志功能过程中常见的一些问题,包括基础API、格式化、日志转发及可视化等方面,代码采用Go语言描述。
一、Basic
1、后台输出
1 | package main |
2、There are no exceptions in Golang, only errors.
Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常,替代方案是使用多值返回来返回错误。当然Go并不是全面否定异常的存在,或者用recover+panic语法实现,只是极力不鼓励多用异常。
1 | package main |
3、写入日志文件:
1 | package main |
1 | YRMacBook-Pro:go-log yanrui$ more test.log |
二、格式化
推荐日志工具库:logrus
1 | $ go get github.com/Sirupsen/logrus |
1、JSON format
1 | package main |
日志输出样式:
1 | { |
三、附加上下文
通过logrus库可以加入一些上下文信息,例如:主机名称,程序名称或者会话参数等。
1 | contextLogger := log.WithFields(log.Fields{ |
日志输出样式:1
2
3
4YRMacBook-Pro:go-log yanrui$ 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"}
YRMacBook-Pro:go-log yanrui$
四、Hooks
我们还可以利用Hook机制实现日志功能扩展,例如Syslog hook,将输出的日志发送到指定的Syslog服务。
1 | package main |
验证是否发送Syslog:
1 | $ sudo tcpdump | grep 59.37.0.1 |
五、可视化
在真实场景中日志数据体量非常庞大,日志存储只是第一步,更多的情况是需要查看特定指标或者能够快速检索信息,此时日志分析平台就发挥作用了。
- GoAccess: Web Server Log
1 | $ wget https://tar.goaccess.io/goaccess-1.3.tar.gz |
在使用logmatic之前,需要下载它的hook支持:
1 | $ go get github.com/logmatic/logmatic-go |
1 | func main() { |
效果如下:
Tips
Tail Multiple Files
1 | # Native Tail Command |
扩展阅读:开发语言&代码工程
- Stack Overflow:2017年最赚钱的编程语言
- 玩转编程语言:构建自定义代码生成器
- 远程通信协议:从 CORBA 到 gRPC
- 基于Kafka构建事件溯源型微服务
- LinkedIn 开源 Kafka Monitor
- 基于Go语言快速构建一个RESTful API服务
- 应用程序开发中的日志管理(Go语言描述)
参考文献
- 云风的BLOG:断点单步跟踪是一种低效的调试方法
- logmatic.io:Our Guide to a Golang logs world
- logmatic.io:Beyond Application Monitoring
- Syslog RFC 5424
- Golang Blog:Error handling and Go
- Dave Cheney:Why Go gets exceptions right
- 蝈蝈俊:Go的异常处理 defer, panic, recover
- 知乎:Go 语言的错误处理机制是一个优秀的设计吗?
- Monolog优化及打造ELK友好的日志格式 | Leo108’s Blog
- 4 Ways to Watch or Monitor Log Files in Real Time
- 【年度案例】Twitter高性能分布式日志系统架构解析 | 原创 2015-12-24 郭斯杰 高可用架构
- BEST PRACTICES:EVENT LOG MANAGEMENT FOR SECURITY AND COMPLIANCE INITIATIVES| By Ipswitch, Inc. Network Managment Division
- rsyslog 8.1901.0 documentation