加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 应用 > 正文

应用程序日志规范

发布时间:2022-11-16 18:02:24 所属栏目:应用 来源:转载
导读: 来自应用层的日志是你的应用对你唯一的反馈。让日志合理化并具有良好的检索能力,就像在一个黑暗的房间里点亮了一个火把。当任何问题出现时,“充分利用日志”这一做法带来的效果常常被我们

来自应用层的日志是你的应用对你唯一的反馈。让日志合理化并具有良好的检索能力,就像在一个黑暗的房间里点亮了一个火把。当任何问题出现时,“充分利用日志”这一做法带来的效果常常被我们低估。作为软件工程师,我们能利用应用层日志解决问题,以及了解应用整体的健康状况。

日志还可以帮助分析应用程序的性能。

目录什么是日志

时间戳(timestamp)+数据(data)=日志(log)

log 单词的愿意是“原木,航海日志”

古代的航海家经常把非常结实的原木做成桅杆,而最古老的记事工具根本不是纸笔等,如何记事呢? 很简单,太阳东升西落一次,航海家就在桅杆上刻下一个刻痕,代表一天已经过去了,于是 log 就从“原木”演化到“航海日志”。

日志记录什么

记录有帮助的信息

什么时候记录日志

安全相关日志

监管/标准要强制(外部系统访问)

业务相关日志

日志消息分解

上下文(Context)意思(Meaning)

When

Timestamp

Where

System/Application/Component

Who

User

What

Action

Result

Status

Priority

Serverity, rank, level

记录的一行日志,就像讲述一个故事,when, what, who, and why

日志行结构化标准

在日志行中固定使用一个结构,拥有这些简单的结构化后,日志信息就会变得易于检索。非常推荐在日志行中记录上下文信息,例如:当记录订单无法正常发货的日志时,可以同时添加订单的详细信息到日志中(当然是指订单中不敏感的信息)。

每行日志遵从标准日志行结构化样例多行日志,第2行开始,以一个空白字符开头日志详情中,如果继续需要结构化支持,建议在前面使用 key1:value1 key2:value2的形式,如果value包含有非字母数字部分,则使用双引号包含标准日志行结构化样例

2020-04-23 20:50:06.392    INFO 66668 --- [1] [127.0.0.1-1544498251.152-3835-1940] logger.go:145        : {"key1":"value10","key2":"value20"} read ~/.otterbeat/TableStats.lastTime got no new items

它包含以下结构化部分,每个部分以一个空格分开:

Part1Part2Part3---Part4Part5Part6:Part7Part8

时间

日志级别

PID

---

[线程ID]

[TRACEID]

打印位置

:

上下文

日志详情

时间,固定格式yyyy-MM-dd HH:mm:ss.SSS日志级别,占位 7,右对齐,大写。取值 ERRORWARN/WARNINGINFODEBUG线程ID,或者协程IDTRACEID,跟踪ID打印位置,格式 logger:lineGO语言%-20sJAVA%-40s上下文,使用 JSON 格式数据,可选,当存在时写入,以便日志解析器解析日志详情多行日志示例

2020-04-27 17:39:04.070 WARNING 71370 --- [19] [] log_test.go:30       : errors error
 github.com/bingoohuang/gou/lo.TestSetupLog
 	/Users/bingoobjca/github/gou/lo/log_test.go:26
 testing.tRunner
 	/usr/local/go/src/testing/testing.go:991
 runtime.goexit
 	/usr/local/go/src/runtime/asm_amd64.s:1373
 open failed
 github.com/bingoohuang/gou/lo.TestSetupLog
 	/Users/bingoobjca/github/gou/lo/log_test.go:27
 testing.tRunner
 	/usr/local/go/src/testing/testing.go:991
 runtime.goexit
 	/usr/local/go/src/runtime/asm_amd64.s:1373
 read config failed
 github.com/bingoohuang/gou/lo.TestSetupLog
 	/Users/bingoobjca/github/gou/lo/log_test.go:28
 testing.tRunner
 	/usr/local/go/src/testing/testing.go:991
 runtime.goexit
 	/usr/local/go/src/runtime/asm_amd64.s:1373
2020-04-27 17:39:04.070    INFO 71370 --- [19] [] log_test.go:33       : {"key1":"value10","key2":"value\n20"} abcefg

日志文件日志默认存储在 $HOME/logs/{appName}/目录下面,例如:/Users/bingoobjca/logs/otterbeat/当前正在写入的日志名为 {appName}.log,不带日期后缀,例如:otterbeat.log归档日志,以天为单位,格式为 {appName}.log.{YYYY-MM-DD},日期作为文件名后缀,例如:otterbeat.log.2020-04-24归档日志的默认保留时间是7天应用程序禁止:禁止日志中写入大量的噪音信息,比如 ====,$$$$ 等禁止:标准日志中已经输出当天时间,应用程序,应避免重复输出禁止:标准日志中输出的其它内容(进程号/线程号)等,应用程序也应该避免重复输出选择日志库

开源的日志库非常多,基本每个语言都有数十种,选择一个符合公司/业务需求的日志库需要精挑细选,有一个简单的指导原则是尽可能使用比较流行的日志库的稳定版本应用程序日志,入坑的几率要小一点。例如:

日志形态选择日志级别

日志等级是用来区分日志对应事件严重程度的说明,这是所有日志中必须具备的一个选项。通常日志会分为6个不同的等级:

FATAL(致命):用来输出非常严重或预期中不会发生的错误。ERROR(错误):非预期中的错误,此种错误可能导致部分系统异常但不会影响核心业务和系统正常运行。WARN(警告):潜在的危险或值得关注的信息(比较核心的路径)。INFO(信息):应用执行过程中的详细信息,一般通过该信息可以看到每个请求的主要执行过程。DEBUG(调试):用于线下调试的日志信息,用于分析应用执行逻辑,线上应用切勿开启。TRACE(跟踪):输出最细致的运行轨迹,可能包含涉及的数据内容。最佳实践所有用户请求日志,必须记录。易于搜索的日志输出方式

正例:没有新的数据时,在详细日志中打印 没有新的数据,有输出时打印 发现新的数据,共10条

反例:只是在详细日志中打印发现0条新数据,或者发现10条新数据,这样难于搜索 发现新数据不好的例子好的例子合理地记录信息始终遵循严格的日志级别小心地记录日志(不要影响系统性能)语言定制Golang使用 github.com/pkg/errors 库的 errors.Wrapf(err, "open file %s", filename) 来形成错误堆栈使用 %+v 来打印日志堆栈logrus.Warnf("errors %+v", err)参考资料Logging best practices有人翻译 日志记录的最佳实践logging-best-practices.pdfAre logs a software engineer’s best friend? Yes -- follow these best practiceslocal pdfKubernetes 中日志的正确输出姿势

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!