Java中存储Log日志信息经验总结

本文详细介绍了日志输出的常见问题与最佳实践,包括异常信息的正确格式、避免不规范的变量打印、删除不必要的DEBUG级别判断,以及日志对象的声明方式。合理的日志级别设置对于问题定位至关重要,建议根据业务需求使用debug、info、warn和error级别。此外,日志对象声明为private static final可以提高效率和安全性。
摘要由CSDN通过智能技术生成
一、异常信息的格式规范问题
1 logger.error("Best print: ", e);
2 logger.error("Good print: {}", e); //a.
3 logger.error("Bad print: " + e);   //b. 或 + e.toString()
4 logger.error("Bad print: " + e.getMessage()); //c. 或: {}", e.getMessage())

解释:

  • a句仍可打印异常名和堆栈信息,但多输出一对花括号"{}";
  • b句仅打印异常名;
  • c句打印异常消息字符串

以空指针异常(Runtime异常)为例,b句打印"java.lang.NullPointerException",c句打印"null"(过于简陋)。

二、不规范的变量打印

使用slf4j日志组件打印变量时,建议使用”{}”占位符风格(C风格),而不是”+”拼接符(C++风格)。例如:

1 logger.error("Country: {}, Province: {}, City: {}", ctry, prov, city); //占位符
2 logger.error("Country: "+ctry+", Province:" +prov +", City: "+city);   //拼接符

但最常见的变量打印问题,是打印时未使用占位符或拼接符:

1 logger.error("print cannotBePrinted: ", cannotBePrinted);  //Wrong
2 logger.error("print canBePrinted: " + canBePrinted);  //Good
3 logger.error("print canBePrinted: {}", canBePrinted); //Better

注意:
cannotBePrinted或canBePrinted为非Throwable的变量。即异常变量e不适用上述规则,但e.getMessage()适用。

三、多余的DEBUG级别判断

使用slf4j日志组件以Debug级别打印时,debug()方法内部会调用isDebugEnabled()判断调试级别。因此,下述代码里的判断没有必要

if(logger.isDebugEnabled())
{
    logger.debug("handleChanges end:{}:{}(ms) ", new Object[] {changes, useTime});
}
四. 日志对象logger的声明

一般建议日志对象logger声明为private static final。声明为private可防止logger对象被其他类非法使用。声明为static可防止重复new出logger对象,造成资源浪费;还可以防止logger被序列化,造成安全风险。声明为final是因为在类的生命周期内无需变更logger。

然而,实际编码中可根据使用场景稍作变通。例如,static final成员变量通常要求大写(如LOGGER),如果觉得大写别扭,可以去除final修饰。又如,期望logger对象可复用时,可如下定义:

protected final Logger logger = LoggerFactory.getLogger(this.getClass());//????

这样,子类可以直接使用继承来的logger对象打印输出,而无需再次getLogger()获取日志对象。

五、日志级别应合理

如果日志不分级别或级别不合理,则定位问题时就无法快速有效地屏蔽大量低级别信息,给快速定位带来难度。建议与具体实现有关的日志使用debug级,一般的业务处理日志用info级,不影响业务进行的错误用warn级,而记录异常或重要错误的日志应为error级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值