系统日志规范问题之如果shop为null在打印日志时如何解决

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 系统日志规范问题之如果shop为null在打印日志时如何解决

问题一:什么是推荐的日志记录方式?


什么是推荐的日志记录方式?


参考回答:

推荐的日志记录方式是使用标准的日志记录系统,如log4j2或logback。这些日志框架提供了异步日志记录、日志级别控制、日志文件管理等功能,能够满足复杂的日志需求,并且性能优于System.out.println()。


关于本问题的更多问答可点击原文查看:

https://developer.aliyun.com/ask/658489



问题二:如果shop为null,在打印日志时会发生什么?


如果shop为null,在打印日志时会发生什么?


参考回答:

"如果shop为null,在尝试打印shop.getId()时,会抛出空指针异常(NullPointerException,简称NPE)。

这会导致业务流程被中断,因此必须确保在打印日志时不会因为对象为空而抛出异常。

为什么禁止直接使用日志系统(Log4j、Logback)中的API?

应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 (SLF4J、JCL--Jakarta Commons Logging)中的 API。

分析: 直接使用Log4j或者Logback中的API会导致系统代码实现强耦合日志系统,后续需要切换日志实现时会产生比较大的改造成本,统一使用SLF4J或者JCL等日志框架的API,其是使用门面模式的日志框架,可以做到解耦具体日志实现的作用,有利于后续维护和保证各个类的日志处理方式统一。"


关于本问题的更多问答可点击原文查看:

https://developer.aliyun.com/ask/658490



问题三:为什么声明日志工具对象Logger应声明为private static final?


为什么声明日志工具对象Logger应声明为private static final?


参考回答:

"1.声明为private防止logger对象被其他类非法使用。

2.声明为static是为了防止重复new出logger对象;防止logger被序列化,导致出现安全风险;处于资源考虑,logger的构造方法参数是Class,决定了logger是根据类的结构来进行区分日志,所以一个类只要一个logger,故static。

3.声明为final是因为在类的生命周期无需变更logger,避免程序运行期对logger进行修改。

为什么对于 trace/debug/info 级别的日志输出,必须进行日志级别的开关判断?

如果配置的日志级别是warn的话,上述日志不会打印,但是会执行字符串拼接操作,如果name是对象, 还会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印,因此建议加日志开关判断。正例: 在trace、debug、info级别日志打印前加上对应级别的日志开关判断,通常可以将开关判断逻辑包装在日志工具类中,统一实现。"


关于本问题的更多问答可点击原文查看:

https://developer.aliyun.com/ask/658491



问题四:为什么捕获异常后不要使用e.printStackTrace()打印日志?


为什么捕获异常后不要使用e.printStackTrace()打印日志?


参考回答:

"反例:

public void doSth(){    
try{        
// 业务逻辑        
...    
} catch (Exception e){        
e.printStackTrace();    
}
}

分析:

1.e.printStackTrace()打印出的堆栈日志跟业务代码日志是交错混合在一起的,通常排查异常日志不太方便。

2.e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多,字符串常量池所在的内存块没有空间了,即内存满了,系统请求将被阻塞。

正例:

public void doSth(){    
try{        
// 业务逻辑        
...    
} catch (Exception e){        
log.error(""execute failed"", e);    
}
}"


关于本问题的更多问答可点击原文查看:

https://developer.aliyun.com/ask/658492


问题五:为什么日志打印时禁止直接用 JSON 工具将对象转换成 String?


为什么日志打印时禁止直接用 JSON 工具将对象转换成 String?


参考回答:

"1.fastjson等序列化组件是通过调用对象的get方法将对象进行序列化,如果对象里某些 get 方法被覆写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。

2.打日志过程中对一些对象的序列化过程也是比较耗性能的。首先序列化过程本身时一个计算密集型过程,费cpu。其次这个过程会产生很多中间对象,对内存也不太友好。

可以使用对象的toString()方法打印对象信息,如果代码中没有对toString()有定制化逻辑的话,可以使用apache的ToStringBulider工具。"


关于本问题的更多问答可点击原文查看:

https://developer.aliyun.com/ask/658493

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 监控 数据库
Django 后端架构开发:高效日志规范与实践
Django 后端架构开发:高效日志规范与实践
56 1
|
2月前
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
51 0
|
5天前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
19 3
|
11天前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
27 4
|
2月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
17天前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
40 0
|
17天前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
33 0
|
1月前
|
监控 前端开发 开发者
前端代码规范 - 日志打印规范
前端代码规范 - 日志打印规范
|
2月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
110 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
1月前
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。