系统日志的重要性_系统日志作用-程序员宅基地

技术标签: 软件  

系统日志的重要性

  与一个简单的算法不同,一个合格的系统不仅仅要求具有运行的高效和计算的准确,同时又必须兼顾稳定性、可靠性。其次,对于开发人员来说,又必须具有可拓展性和可维护性。各方面都必须很完善,这样的一个系统才能称得上是一个合格完美的系统。简单的站在开发人员的角度分析,比较重视的是系统的可维护性,毕竟开发人员直面的是系统的代码实现。一个代码结构冗杂、模块设计混乱、命名“异想天开”的系统对于开发者来说简直到了咬牙切齿的地步!不能忍!坚决不能忍!所以在平时的开发过程中就要时刻注意着系统的实现机制,从宏观设计和微观实现上面同时进行精雕细琢。前几天看到阿里巴巴出的《Java 开发规范》,这里附上链接,建议大家看看。

  说到可维护性及不得不涉及到系统监控和Bug的快速定位。在开发阶段还比较容易对系统进行监控,一般都会在本机上对系统的运行进行实时监控。而对于bug的定位,开发者都会熟练使用debug功能进行bug定位,更有甚者通过多年的开发经验根据系统的异常信息直接能分析出来Bug产生的原因、位置以及解决方案。但是,系统毕竟是人开发的,我们无法预料到在运行中会出行什么想不到的问题,即使在各种测试中没有出现,但是也无法保证不会出现一些意想不到的问题。那么在系统运行期间如果产生问题出现异常且无法在测试环境中重现,我们又该如何快速、准确地对bug进行定位分析和解决呢?举个亲身的例子吧,公司一套设备监控系统,用来对上万个节点进行实时监控,如果该节点有异常(比如温度过高、电压过高等)则向系统进行发出告警信息。在开发环境中只有五十多个设备被安全(不会产生什么告警)的放在机房中供开发和测试使用,这种测试环境根本无法模拟实际环境。系统在测试中没有出现过什么大的问题。然而,在实际的运行环境中,偶尔发现系统的一个模块功能会丧失,失去告警接收的功能。在本地测试的时候从来没有发现过类似问题,但是部署在实际环境中就会有发生。我们不可能实时的24小时对系统进行人工监控,那么该如何定位功能丧失的原因呢?这时,对于系统日志来说就“是时候表演真正的技术了”。后来通过系统日志分析之后发现功能的丧失是由于大量的告警同时上报导致数据库链接不够用产生大量connectionTimeout进而导致OOM异常,这个模块彻底死了。可见,日志对于运行环境中系统的监控和问题定位是至关重要的,在系统设计、开发和实现的过程中必须时刻注意着log的输出,这将会对于日后的系统监控和异常分析起至关重要的作用!

  那么,在系统日志实现上应该注意哪些问题呢?如何做到不滥用日志、减少大量无用信息,让日志记录足够精简明了?

  第一:系统的哪些运行信息需要进行日志记录?

    1、功能模块的启动和结束完整的系统由多个功能模块组成,每个模块负责不同的功能,因此需要对模块的启动和结束进行监控。是否在需要的时机正常加载该模块?又是否在退出结束的时候正常完成结束操作,正常退出?

    2、用户的登录和退出哪位用户在什么时间通过什么IP登录或退出了系统

   3、系统的关键性操作数据库链接信息、网络通信的成功与失败等

   4、系统运行期间的异常信息NPE、OOM以及其他的超时、转换异常等)

    5、关键性方法的进入和退出(一些重要业务处理的方法,在进入和结束的时候需要有日志信息进行输出)

    ……

      ……

  第二:什么样的日志格式有助于开发者进行明确的分析?

       日志信息要求必须精简,过多的无用信息不但对系统分析起不到什么作用,反而会增加系统的运行压力、消耗系统的运行资源。这里有个日志模板,可供参考。

       时间-[线程名][日志等级]-日志输出位置(全类名,可以精确到方法名):日志信息

      2013-09-04 10:49:20.296-[Thread-initRedis21504][INFO]-com.shanghai.LoginController.initLogInfo:LingMing[User] is logining

       日志信息的内容可以根据不同的情况进行设计,但是前面的时间到日志输出位置必须要保证完整性,这样才有利于日志的分析。

  第三:如何对不同的日志信息进行等级划分?

      日志等级通常分为四种:DEBUG、INFO、WARN、ERROR

      DEBUG:系统调试信息,通常用于开发过程中对系统运行情况的监控,在实际运行环境中不进行输出。

      INFO:系统运行的关键性信息,通常用于对系统运行情况的监控。

      WARN:告警信息,系统存在潜在的问题,有可能引起运行异常,但此时并未产生异常。

      ERROR:系统错误信息,需要进行及时处理和优化。

   这里列出来了各种等级的日志信息,在开发过程中哪些信息需要设置为哪种等级有赖于开发者的自己判断,这里只是给个建议。

  日志的管理是系统很重要的一部分,千万不可忽略其重要性。完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能达到事半功倍的效果。开发者必须要明白日志的价值和意义,万万不可忽略和轻视,并且在系统设计之初就建议制定一份关于日志管理的说明规范,明确哪些方法、操作必须进行日志输出,在进行开发过程中也要严格遵守。

  至于日志输出的实现,不同的开发语言有不同的日志管理框架,同一种语言也有很多不同的日志管理方案,这里就不再进行赘述。本文目的就是想让开发者看到日志的重要性。

 

https://www.cnblogs.com/PerkinsZhu/p/6440584.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zoecom/article/details/89532249

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签