在Java编程中,良好的日志记录是一项重要的实践。无论是在调试代码还是在生产环境中追踪问题,准确的日志信息能够提供有价值的上下文和跟踪数据。然而,对于许多开发者来说,正确地记录日志可能是个挑战。
创新互联服务项目包括下陆网站建设、下陆网站制作、下陆网页制作以及下陆网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,下陆网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到下陆省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
本文介绍一些简单且实用的技巧,以帮助读者在Java编程中改善日志记录,使其更加高效和易于调试。
理想的日志格式应包含最基本的信息,例如当前时间戳(通常精确到毫秒)、日志级别、线程名称等。可以像下面这样配置logback日志:
%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n
如果开发者的日志格式不记录当前时间,那么甚至无法知道请求发生的时间。
常见的日志级别有五个,分别是error、warn、info、debug和trace。在日常开发中,开发者需要选择适当的日志级别,不要直接打印info级别的日志。
对于较低的日志级别,如trace/debug级别,必须进行日志级别开关判断。
User user = new User(666L, "demo");
if (log.isDebugEnabled()) {
log.debug("userId is: {}", user.getId());
}
由于目前存在以下日志代码:
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
如果配置的日志级别是warn,上述日志将不会被打印,但仍会执行字符串拼接操作。如果符号是对象,还将执行toString()方法,这会浪费系统资源。尽管进行了上述操作,但最终日志并未打印出来,因此建议添加日志开关判断。
开发人员不需要打印大量的日志,只需要打印能够快速定位问题的有效日志。什么是有效和关键的日志呢?
就参数而言,通常是关键信息,比如userId等。
SLF4J是一个以门面模式(facade mode)工作的日志框架,有利于统一各个类的维护和日志处理方法,而且可以轻松替换底层的日志框架且不需要修改代码。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Demo.class);
当遇到 if...else... 或 switch 等条件语句时,应尽量在分支的第一行打印日志,这样在排查问题时,可以通过日志确定进入了哪个分支,代码逻辑更清晰,也更容易排查问题。
if (user.isVip()) {
log.info("User isVip, Id: {}", user.getUserId());
} else {
log.info("User not isVip, Id: {}", user.getUserId());
}
以上代码示例在每个分支的第一行使用日志打印。
错误的用法:
logger.info("Processing trade with id: " + id + " and symbol: " + symbol);
在上面的例子中,使用 + 运算符来拼接字符串会带来一定的性能损失。
正确的用法:
logger.info("Processing trade with id: {} and symbol: {}", id, symbol);
在日志中使用花括号 {} 作为占位符,这比使用 + 运算符更加优雅和简洁。与负面示例相比,占位符的使用只是一个替换操作,可以有效提高性能。
错误的用法:
try {
...
} catch (Exception e) {
e.printStackTrace();
}
正确的用法:
try {
...
} catch (Exception e) {
log.error("error", e);
}
使用e.printStackTrace()打印的堆栈日志与业务代码日志交织在一起,通常不方便检查异常日志。
e.printStackTrace()语句生成的字符串记录了堆栈信息。如果信息过长,字符串常量池所在的内存块没有空间,也就是内存已满,那么用户的请求会被阻塞。
日志最终会输出到文件或其他输出流中,这涉及到IO性能。如果采用异步方式,可以显著提高IO性能。
除非有特殊要求,建议使用异步方式输出日志。以logback为例,配置异步非常简单,只需使用AsyncAppender:
以上配置使用AsyncAppender来实现异步输出日志。
在联机环境中禁用调试功能非常重要。
因为通常系统会有大量的调试日志,各种框架也会大量使用调试日志,在线调试可能会很快填满磁盘,影响业务系统的正常运行。
新闻名称:十个Java编程中记录日志的小技巧
当前路径:http://www.mswzjz.cn/qtweb/news24/248574.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能