Java开发日志对于一个系统来说非常重要,需要使用日志来查找异常信息,分析系统的运行情况。所以无论如何JDK和第三方都提供了关于日志的工具。本文主要介绍Java开发中需要注意的事项Java开发日志。
Java开发日志规约有以下10条,常言道无规矩不成方圆,当然做java开发也不例外,只有学习了解了java开发日志规约,你才能够在开发过程中游刃有余,不要走开,让我们赶紧进入学习状态哦!
1. 日志系统不能直接用于应用(log4)j、Logback)中的 API,日志框架SLF4JJ应依赖于使用 中的 API,日志框架采用门面模式,有利于维护和各种日志处理方法的统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
2. 至少保存所有日志文件。 15 天空,因为有些异常“周”这是频率的特征。网络运行状态、安全相关信息、系统监控、后台运行管理、用户敏感运行保留相关网络日志不少于 6 个月。
3. 扩展日志(如打点、临时监控、访问日志等)在应用中的命名方法:
appName_logType_logName.log。logType:例如,日志类型 stats/monitor/access 等;logName:日志描述。这个命名的好处:日志文件属于什么应用,什么类型,什么目的,通过文件名可以知道,也有利于分类和搜索。
注:建议对日志进行分类,如将错误日志和业务日志分开存储,方便开发人员查看,并通过日志及时监控系统。
正例:force-web 单独监控应用中时区的异常转换,如:force_web_timeZoneConvert.log
- 占位符是在日志输出时拼接字符串变量的方式。
说明:因为 String 将使用字符串的拼接 StringBuilder 的 append()方法,有一定的性能损失。使用占位符只是替换动作,可以有效提高性能。
正例:logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);
- 对于 trace/debug/info 日志级输出必须判断日志级开关。
说明:虽然在 debug(参数)方法体内第一行代码 isDisabled(Level.DEBUG_INT)真时(Slf4j 的常见实现 Log4j 和 Logback),就直接 return,但参数可能是字符串拼接运算。另外,如果debug(getName()这类参数内有 getName()方法调用,不必要的浪费方法调用费用。
正例: // 如果判断是真的,则可以输出 trace 和 debug 级别的日志
if (logger.isDebugEnabled()) {
logger.debug("Current ID is: {} and name is: {}", id, getName());
}
6. 避免重复打印日志,浪费磁盘空间 log4j.xml 中设置 additivity=false。
正例:
7. 异常信息应包括两种信息:犯罪现场信息和异常堆栈信息。如果没有处理,那么一般 过关键字 throws 往上抛出。
正例:logger.error(各种参数或对象 toString() + "_" + e.getMessage(), e);
8. 仔细记录日志。禁止输出生产环境 debug 日志;有选择地输出 info 日志;如果使用 warn 记录刚上线时的业务行为信息,一定要注意日志输出的问题,避免使服务器磁盘爆炸,记得及时删除这些观察日志。
注:大量无效日志的输出不利于系统性能的提高,也不利于错误点的快速定位。记录日志时,请考虑:有人真的看到了这些日志吗?看到这个日志你能做什么?它能给问题调查带来好处吗?
9. 可以使用 warn 记录用户输入参数错误的日志级别,避免用户投诉时不知所措。如果没有必要,请不要在这个场景中播放 error 避免频繁报警。
注:注意日志输出的等级,error 级别只记录系统逻辑错误、异常或重要的错误信息。
10. 用英语描述日志的错误信息。如果日志中的错误信息用英语描述不清楚,可以用中文描述,否则容易产生歧义。由于字符集的问题,国际团队或海外部署的服务器使用全英语来注释和描述日志的错误信息。
遵守Java开发日志规定可以写出标准完善的日志,对系统的异常分析和处理以及系统的运行管理具有重要意义!然而,这也是许多开发中不可避免的忽视和错误,因此我们应该足够重视这些Java开发日志的规定。