网站首页 > 教程文章 正文
几乎所有大厂都会对代码规范有着严格要求,以确保多人协作开发出来的代码质量有统一的标准。在Java开发领域,《阿里巴巴Java开发手册》被开发者们广泛学习和应用。原手册内容较多,本文仅列出日志方面需要重点注意的事项(强制遵守的规则),并分析规定背后的原因,所谓知其然,亦知其所以然。
1. 应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);
说明:使用SLF4J框架,可以做到代码与日志记录器的解耦。
目前作为行业标准的日志记录器是Log4j2和logback。前一阵Log4j2爆出巨大漏洞,为了快速解决漏洞,可将Log4j2改为Logback,如果使用SLF4J框架,那么代码就几乎不需要做什么改动。关于Log4j2的漏洞介绍,可以参考前文《如何应对Log4j2核弹级漏洞》。
2. 日志文件推荐至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。
3. 应用中的扩展日志(如打点、监控、访问日志等)命名方式:
appName_logType_logName.log。
- appName:应用名称。
- logType:日志类型,推荐分类有stats/desc/monitor/visit 等;
- logName:日志描述。
这种命名的好处是:通过文件名就可以知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
正例:mppserver 应用中单独监控时区转换异常,如:
mppserver_monitor_timeZoneConvert.log
说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。
4. 对 trace/debug/info 级别的日志输出,必须使用条件输出形式或者使用占位符的方式。
说明:logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
如果日志级别是 warn,上述日志不会打印,但是会执行字符串拼接操作,如果 symbol 是对象,会执行 toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。
正例:通过条件判断,避免不必要的字符串拼接。
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
}
正例:通过占位符,避免不必要的字符串拼接。
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
5. 避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false。
正例:<logger name="com.taobao.dubbo.config" additivity="false">
说明:配置子logger,目的就是控制一定范围内的日志输出。
log4j.logger.cn.server.test=error,E
比如这里的子logger是控制cn.server.test包下面的所有类的日志输出,其父logger就是rootLogger。
log4j的additivity属性: 表示子logger是否要在父logger的 appender (输出介质)中输出日志,若是 additivity 设为 false,则子Logger只会在自己的 appender 里输出,而不会在父Logger的appender里输出。
6. 处理异常时,一定要将异常信息打印到日志中。异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。
正例:logger.error(各类参数或者对象 toString + "_" + e.getMessage(), e);
猜你喜欢
- 2024-12-12 人人都是程序员?百度、阿里同天向个人免费开放AI编码助手
- 2024-12-12 if-else嵌套太深?教你一个新手都能掌握的设计模式搞定!
- 2024-12-12 靠左神这套程序员代码面试指南入职阿里、腾讯、美团、百度不再难
- 2024-12-12 前端开发有哪些编码规范?
- 2024-12-12 阿里低代码框架 lowcode-engine 低代码表单实战
- 2024-12-12 阿里P9整理10w字内部并发编程手册,GitHub百万下载量
- 2024-12-12 阿里通义千问代码模型Qwen2.5-Coder全系列正式开源
- 2024-12-12 我入职阿里后,才知道原来简历这么写
- 2024-12-12 最全阿里P系列解读:P5—P8的技能要求和薪资结构
- 2024-12-12 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)