本文主要为需要进行软件开发的读者提供一些经验和建议。
面向读者
需要进行软件开发的程序员
需要所开发系统进行整体把控的软件工程师
1.有关日志的基本讨论
在介绍如何设计日志内容前,有以下几个问题需要进行一些简单讨论。
本文的全部内容都基于以下这些讨论来编写。
1.1为什么要输出日志?
答:为了定位「问题」。
有人认为,系统在运行时如果遇到运行时错误时,本身编程语言或者虚拟机层面就会抛出错误,并且会标记具体的代码行号,所在函数等。并不需要额外去输出日志。也有人认为,系统在上线前,就已经经过详细的测试,所有的处理都已经被检验过,没有必要再在日志中输出相关内容。还有人认为,系统上线后出问题还是自己去负责修复,别人根本也不会去看日志,因此输不输出日志都无所谓。
这些想法都是比较片面的。
我们提到问题,不仅仅是系统报错,也可以是和设计不符的处理过程,甚至可能是用户不肯承认所做的操作而寻找的证据。其次,虽然系统在上线前「理应」被完整地测试,但测试工作本身也可能有出错,有遗漏。如果去要求测试%没有疏忽的话,不如去要求开发%没有Bug来的更加直接。最后,开发一个系统的工作并不仅仅只有开发,测试、运维甚至后续运营,好的日志不仅为自身开发带来便利,对其他岗位也有帮助,可以提高团队的整体运行效率。反过来,其他岗位在反馈问题时,如果有日志可查可附带,对开发本身也能带来极大的便利。
因此,无论一个系统多么完美,是否被详细测试过,输出日志都是必不可少的工作。
1.2日志输出了给谁看?
答:「所有」与这个系统相关的人,都需要查看全部或者部分日志。
有人认为,日志只是自己开发调试,以及后续对线上Bug调查时自己看的。「反正代码最后都是自己来改」,那么其他人不需要看,也没必要看。
这个想法也是错误的。
和「编写代码除了自己能看懂,也要让别人也能看懂一」样。如果说代码仅限开发岗需要看的话,那需要看日志的岗位就更多了。和上一问中提到的,测试、运维甚至运营都是有可能需要查看全部或者部分日志,并为他们的工作提供帮助。
因此,一份越多人能看得懂、用得上的日志,是我们应当追求的目标。
1.3不输出日志或者日志内容随意有什么危害?
答:各种想得到或者想不到的问题都会接踵而来
结合上面两问,这个问题的解答就变得显而易见了。
相信通过以上「日志三问」,读者应该能够理解本文有关日志的观点。接下来,就具体看一下如何输出日志。
2.日志格式
一般来说,一行日志即一行文本。虽然日志本身并没有严格要求格式,但规范、统一的日志输出格式不仅可以方便阅读,也能便于各种日志系统搜集提取。
2.1纯文本日志
纯文本日志是最常见,也最简单的日志输出形式。绝大多数编程语言中,都可以简单地print输出日志。
优点是可以完全自行规划格式,缺点就是不利于日志系统搜集提取。
一段典型的纯文本日志如下:
[12-:54:44][web01][TRACE-FD8CDE88][ANONYMITY][
ANONYMITY][+0ms][0ms][REQUEST]host=`web01:`,method=`GET`,url=`/users`,query=`{"pageSize":""}`,originalUrl=`/users?pageSize=`[12-:54:44][web01][TRACE-FD8CDE88][ANONYMITY][ANONYMITY][+1ms][0ms][REQUESTFROM]ip=`.16.35.1`,ips=``,remoteip=``,x-real-ip=``,x-forwarded-for=``,x-forwarded-proto=``,referer=`