|
本文所说的日志,是将程序运行过程中的细节写入文本,供事后分析使用,主要面向程序员或者运维人员。日志原则上不属于系统人机界面的一部分。跟告警系统的作用不一样,告警系统主要面向用户,而且是人机界面的重要组成部分。
谈起日志,大家首要的印象,大概是属于程序的附属功能,似乎不那么重要。但是如果开发工业级的生产系统,这种思想一定需要扭转过来。日志的重要性几乎与程序功能代码不相上下。日志至少可以起到如下作用:
出现bug时,便于追查原因。很多工业系统部署的位置很远,或者部署于内网,不方便联网或者拨号处理。出现问题,哪怕是凌晨两点出现问题,也需要立刻解决。这时候乙方程序员往往立即订机票都来不及了,日志显然可以多一种处理问题的方法。另外,复杂故障,并不一定是重启进程后,就可以复现的。日志在许多情况下是追查问题的唯一手段。
可以分清责任。比如说某种电网控制系统,控制逻辑是用户提供的,但程序实现是乙方完成的。如果这种电网控制系统出现了意外行为,通过日志可以判定是逻辑的问题,还是具体实现的bug,有助于迅速定位问题,避免扯皮。
日志还可以有其它作用,特别是对于多线程并发编程,传统的调试工具、测试性能工具都会有局限性。很多时候需要依赖日志给出的信息。
下面举几个日志在工程应用的例子。
1. 阿里云的第一行代码
阿里云是优秀的国产基础软件,首倡者被评为院士。可以说,无论在工业界、还是在学术界,都得到了很高的认可。阿里云的第一行代码是什么样子呢?请看:
可以看到,阿里云的第一行代码就是日志。当然,这并不能说明日志在阿里云中到底起到什么作用,毕竟我没有更多的资料,但这件事可以参考。
2. 东方电子公司的备自投控制系统
东方电子公司的备自投控制系统是通过电网的实时潮流,经过分析之后,远程控制备自投的投退压板。我考察过这一系统,对该系统的日志印象深刻。比如说,系统的日志是分门别类的,例如,备自投关心的遥信变化,专门是一个日志;备自投执行周期的相关设备遥测,是一个日志;备自投内部的逻辑判断,也是一个日志;坏数据或可疑数据,也有专门的日志。出现任何现象,都可以由日志追踪原因。
3. 我开发的状态估计运行日志
这是我以前在国网华北分部开发的功能,之前状态估计,出现合格率低、不收敛等异常情况,都转瞬即逝了,很难事后分析。因此开发日志系统,记录历史信息,可以起到一个很好的调试工具的作用。论文记载了一个实际案例:某天夜里,华北电网状态估计出现连续发散,当时是星期天, 自动化维护人员未上班。若只靠状态估计功能,由于历史信息已经丢失,很难查出发散原因。通过日志分析,分析出当时内蒙古电网的通信链路中断,许多量测不变化,导致状态估计发散。
对于一个多线程的复杂程序,应该怎么设计日志系统?下面给出一些建议:
首先,日志应该是高性能的,至少不能影响业务系统的实时性。因此,日志写入硬盘的过程,应该单独由独立的线程完成。日志库是非阻塞的。
无论程序是不是并发,日志线程本身是串行的。这里对线程间的锁要有所设计。
程序core dump时,要尽量不丢失日志信息。我的经验是部分日志会缓存入mmap地址映射的内存区域,这部分信息会同步到硬盘二进制文件。‘
下面是我画的日志线程与工作线程的关系,可以参考。
下面推荐几个C++日志库。
陈硕的muduo中的日志库,这个日志库是我目前在用的,当然有定制需求,直接在代码上修改。这个日志库的优点是短小精炼,不会有冗余的功能。
spdlog,据说是非常优秀的日志库,只需要头文件就可以使用,没有其它依赖。这个库使用了现代C++的特性,例如C++20 的 format 风格。
boost库中也有相应的日志库。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-1 07:10
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社