首页 > 其他分享 >自研日志实用工具类

自研日志实用工具类

时间:2023-04-01 18:33:27浏览次数:41  
标签:输出 自研 实用工具 long 条目 后缀 转成 日志

  今天我来分享一个关于日志的问题和解法。

问题

  没有界面的后端程序在实际运行中发生了什么事,通常是通过日志来探查。所以日志非常重要。数据库记录了程序运行的结果,日志记录了程序运行的过程。但是日志经常出现一个问题,日志量太多,以至于把重要的日志淹没在里面。未能及时地发现问题,或者当有问题出现的时候,在日志中找原因真的是很痛苦。

  对于这个问题,第1招就是把日志进行分级,差不多是每一种日志工具都提供了这个功能。常见的有info、warn、error这些级别。当使用级别进行过滤之后,往往发现日志还是太多。就需要进一步分析原因了。

  在实际项目中发现有这么几种情况:
1. 有大量的日志,内容基本相同,只是有一两个值不同。如“发现无法转成long类型的字符串:xxx”
2. 还有一类日志是内容完全相同,如“意外发现xxx属性的值是null”

至于为什么会有大量的这种日志,大概率是它在循环内部,甚至是多重循环的内部。

解法

解法一:少写日志

  怕日志多而在写日志代码时犹豫,甚至就不写了。当出问题后找不到日志,无法为定位问题提供帮助。此法不可取。

解法二:硬编码控制日志数量

  设置一些标志或计数器来使循环内的同一类日志只打印一条或少数几条,那么日志的逻辑跟业务的逻辑会混在一起,程序的整体逻辑变得复杂。此法是下策。

  如何让程序员大胆写日志,而又不会出现日志太多,同时日志的逻辑也很少掺杂到业务逻辑中呢?

解法三:日志工具类

  我写了一个日志的实用类来解决这个问题。

1. 拼接

  它是将多条日志拼接为一条来输出。采用“前缀+主体+后缀”的形式,在初始化时设置好前缀和后缀,在接收日志条目时拼接条目,最后的输出形式是“前缀+条目1, 条目2, …+后缀”。如果条目数为0,则前后缀都不会输出。所以,“发现无法转成long类型的字符串:aaa”,“发现无法转成long类型的字符串:bbb”“发现无法转成long类型的字符串:ccc”,会拼接这样一条:“发现无法转成long类型的字符串:aaa,bbb,ccc”。合成后的内容长度就大大减少。

2. 条目数限制

  假如类似的情况发生1000次,拼接后的日志还是很长。作为人来讲,只需要看到前面的若干条目,就了解了这个问题,通常是没必要看到全部的值。所以这个日志工具提供了条目数的限制,对于超过限制的条目,则不会输出。比如条目数的限制是2,那输出的结果就是“发现无法转成long类型的字符串:aaa,bbb”

3. 同值合并

  对于内容完全相同的日志,就会直接进行合并,并记录一个次数,不相邻的除外。原本是好几屏幕的“意外发现xxx的值是null”。合并成一条:“[1000*]意外发现xxx的值是null”。(此法是向浏览器的控制台学习)

4. 长度限制

  除此之外,还提供了总长度的限制,即是对“前缀+条目1, 条目2, …+后缀”的总长度的限制。如果某个条目加进去之后整体长度超过这个限制了,那么这个条目就会被丢弃。前缀后缀是不会被丢弃的,但如果“前缀+后缀”已经超出限制了,根据“如果条目数为0,则前后缀都不会输出”最终没有输出。

5. 异常

  此日志类实现特定的接口(Closable),做到了即使在业务代码发生异常的情况下,也不会漏了输出优化后日志。用法:

try (LogUtil log = LogUtil.builder().logger(LOGGER).build()) {
    // ...A
    log.write(“any message”);
    // ...B
}

如果A处发生异常,自然没有任何输出。如果B处发生异常,则不影响前面的“any message”的输出。

  以上的条目数限制、同值合并、总长度限制等功能可单独使用,也可组合使用。所以可能会看到这样的结果:
“发现无法转成long类型的字符串:aaa,bbb,[99*]aaa,[56*]ccc”

 

  这个日志实用工具是对现有日志组件的封装,而现有的日志组件是log4j。不管使用哪个日志组件,都可以加上这种封装。我并没有修改日志组件,只是给他套了一层“壳”。

  实际投入使用后,在我们的项目中发现,有一种相同的日志产生了947条,在过去是刷了好多屏,而且还不知道他多少条,现在合成之后就是一条,并且打上了“[947*]”,不仅没有刷屏,还很清晰的看到了条数。

  干净,舒服。

标签:输出,自研,实用工具,long,条目,后缀,转成,日志
From: https://www.cnblogs.com/BillySir/p/17279071.html

相关文章

  • openfeign开启日志
    openfeign的日志级别有:NONE:默认,不开启日志BASIC:只记录请求方法和URL以及响应状态代码和执行时间HEADERS:记录基本信息以及请求和响应标头。FULL:记录请求和响应的标题、正文和元数据。  全局日志加入Logger.LevelBean:@ConfigurationpublicclassMyConfigration{......
  • 通过Sysmon+Nxlogs收集Windows Server 2012服务器日志-并以Syslog形式发送Json格式数
    0x01环境介绍WindowsServer2012已经安装部署好了域控,目的除了收集Windows服务器本身的日志外还收集域控环境下的各种日志。0x02Nxlog配置和使用使用社区版本即可,下载地址:https://nxlog.co/downloads/nxlog-ce#nxlog-community-edition使用的版本是当前最新版本安装过程就省略,......
  • OpenCloudOS 9.0 发布:首个全自研服务器操作系统
    系统开源社区OpenCloudOS正式发布首个全自研社区9.0版本(以下简称OC9.0)。据了解,该版本由腾讯等十余家企业共同开发并长期维护,其内核及用户态软件均为自主选型、独立演进,在操作系统发行版的全链路均实现自主可控。​操作系统等基础软件是信息技术的根基,也是亟需实现突破,掌握......
  • linux日志总结
    0x00前言Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。本文简介一下Linux系统日志及日志分析技巧。0x01日志简介1.1日志服务syslogd介绍说到Linux的日志,就不得不提到syslogd。它是大部分Linux发行版默认的......
  • 面向chatgpt运维:根据自定义的日志统计访问用户数
    Craftedby[Genie](https://marketplace.visualstudio.com/items?itemName=genieai.chatgpt-vscode)You如何使用awk统计访问用户数,我的日志格式如下:{"level":"info","ts":"2023/03/3108:58:03","msg":"/api/v1/goods/project&quo......
  • 客户端日志和异常处理
    目录一.使用Serilog结构化日志记录日志信息二.捕获全局异常三.使用AOP统一处理异常一.使用Serilog结构化日志记录日志信息Serilog包的引用和使用语法都可以在网上找到(https://github.com/serilog/serilog/wiki/),不再赘述,这里仅分享一下自己在项目中的简单使用。FileLogHelpe......
  • jenkins 彩色日志显示
    目录jenkins彩色日志显示转自jenkins彩色日志显示示例:这里用到ansiColor插件,在Jenkins输出有颜色的日志信息流水线语法的生成ansiColor('xterm'){//someblock}tools.groovypackageorg.devops//格式化输出defPrintMes(value,color){colors=['red'......
  • 使用 Oracle LogMiner 分析重做日志
    概述我们知道oracle的redo和归档日志,记录了数据库的事务的相关信息。在日常的数据库管理过程中,我们有时需要,查看特定时刻特定用户在数据库上执行的操作。这时我们可以通过用logminer分析日志文件获取相关信息。logminer分析归档日志文件所获得的信息并不是原始的操作信息,而是等......
  • ABP VNext 的日志机制 + SeriLog
    **ABPVNext的日志机制**正用ABPVNext做个系统,由于框架默认带来日志处理机制,开发阶段基本能用,也一直没有去动它,快要上线了,思考了一下正式环境的日志管理流程,由于系统不大,预计访问量可能也不大,但默认的日志管理太简单,不便于后期日常维护。缺点如下:默认的日志只有单个文件,写上几......
  • Mysql 事务隔离机制、锁机制、MVCC多版本并发控制隔离机制、日志机制、
    原子性(Atomicity)当前事务的操作要么同时成功,要么同时失败。原子性由undolog日志来实现。一致性(Consistency):使用事务的最终目的,由其它3个特性以及业务代码正确逻辑来实现。隔离性(lsolation):在事务并发执行时,他们内部的操作不能互相干扰,隔离性由MySQL的各种锁以及MVC......