当前位置:首页 > 科技  > 软件

十个Java编程中记录日志的小技巧

来源: 责编: 时间:2024-01-08 09:16:23 298观看
导读在Java编程中,良好的日志记录是一项重要的实践。无论是在调试代码还是在生产环境中追踪问题,准确的日志信息能够提供有价值的上下文和跟踪数据。然而,对于许多开发者来说,正确地记录日志可能是个挑战。本文介绍一些简单且

在Java编程中,良好的日志记录是一项重要的实践。无论是在调试代码还是在生产环境中追踪问题,准确的日志信息能够提供有价值的上下文和跟踪数据。然而,对于许多开发者来说,正确地记录日志可能是个挑战。8RQ28资讯网——每日最新资讯28at.com

本文介绍一些简单且实用的技巧,以帮助读者在Java编程中改善日志记录,使其更加高效和易于调试。8RQ28资讯网——每日最新资讯28at.com

1 选择适当的日志格式

理想的日志格式应包含最基本的信息,例如当前时间戳(通常精确到毫秒)、日志级别、线程名称等。可以像下面这样配置logback日志:8RQ28资讯网——每日最新资讯28at.com

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>       <pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern>    </encoder></appender>

如果开发者的日志格式不记录当前时间,那么甚至无法知道请求发生的时间。8RQ28资讯网——每日最新资讯28at.com

2 选择适当的日志级别

常见的日志级别有五个,分别是error、warn、info、debug和trace。在日常开发中,开发者需要选择适当的日志级别,不要直接打印info级别的日志。8RQ28资讯网——每日最新资讯28at.com

  • Error(错误):指相对严重的错误,会影响正常业务,并需要进行运维配置监控。
  • Warn(警告):一般的错误,对业务影响较小,但需要开发人员的注意。
  • Info(信息):记录关键的故障排查信息,例如调用时间、输入输出参数等。
  • Debug(调试):用于开发阶段的关键逻辑的运行时数据。
  • Trace(追踪):最详细的信息,一般只在日志文件中记录。

3 当日志级别较低时,进行日志开关判断

对于较低的日志级别,如trace/debug级别,必须进行日志级别开关判断。8RQ28资讯网——每日最新资讯28at.com

User user = new User(666L, "demo");if (log.isDebugEnabled()) {    log.debug("userId is: {}", user.getId());}

由于目前存在以下日志代码:8RQ28资讯网——每日最新资讯28at.com

logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);

如果配置的日志级别是warn,上述日志将不会被打印,但仍会执行字符串拼接操作。如果符号是对象,还将执行toString()方法,这会浪费系统资源。尽管进行了上述操作,但最终日志并未打印出来,因此建议添加日志开关判断。8RQ28资讯网——每日最新资讯28at.com

4 日志应打印出该方法的输入和输出参数

开发人员不需要打印大量的日志,只需要打印能够快速定位问题的有效日志。什么是有效和关键的日志呢?8RQ28资讯网——每日最新资讯28at.com

  • 输入方法时,打印输入参数。
  • 方法返回时,打印出参数和返回值。

就参数而言,通常是关键信息,比如userId等。8RQ28资讯网——每日最新资讯28at.com

5 日志系统中的API(如Log4j、Logback)不能直接使用,但可以使用日志框架SLF4J中的API

SLF4J是一个以门面模式(facade mode)工作的日志框架,有利于统一各个类的维护和日志处理方法,而且可以轻松替换底层的日志框架且不需要修改代码。8RQ28资讯网——每日最新资讯28at.com

import org.slf4j.Logger;import org.slf4j.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(Demo.class);

6 当遇到诸如 if...else... 或 switch 等条件语句时,尽量在每个分支的第一行打印日志

当遇到 if...else... 或 switch 等条件语句时,应尽量在分支的第一行打印日志,这样在排查问题时,可以通过日志确定进入了哪个分支,代码逻辑更清晰,也更容易排查问题。8RQ28资讯网——每日最新资讯28at.com

if (user.isVip()) {  log.info("User isVip, Id: {}", user.getUserId());} else {  log.info("User not isVip, Id: {}", user.getUserId());}

以上代码示例在每个分支的第一行使用日志打印。8RQ28资讯网——每日最新资讯28at.com

7 建议使用参数占位符 {} 代替 + 进行字符串拼接

错误的用法:8RQ28资讯网——每日最新资讯28at.com

logger.info("Processing trade with id: " + id + " and symbol: " + symbol);

在上面的例子中,使用 + 运算符来拼接字符串会带来一定的性能损失。8RQ28资讯网——每日最新资讯28at.com

正确的用法:8RQ28资讯网——每日最新资讯28at.com

logger.info("Processing trade with id: {} and symbol: {}", id, symbol);

在日志中使用花括号 {} 作为占位符,这比使用 + 运算符更加优雅和简洁。与负面示例相比,占位符的使用只是一个替换操作,可以有效提高性能。8RQ28资讯网——每日最新资讯28at.com

8 不要使用e.printStackTrace()

错误的用法:8RQ28资讯网——每日最新资讯28at.com

try {  ...} catch (Exception e) {  e.printStackTrace();}

正确的用法:8RQ28资讯网——每日最新资讯28at.com

try {  ...} catch (Exception e) {  log.error("error", e);}

使用e.printStackTrace()打印的堆栈日志与业务代码日志交织在一起,通常不方便检查异常日志。8RQ28资讯网——每日最新资讯28at.com

e.printStackTrace()语句生成的字符串记录了堆栈信息。如果信息过长,字符串常量池所在的内存块没有空间,也就是内存已满,那么用户的请求会被阻塞。8RQ28资讯网——每日最新资讯28at.com

9 建议以异步方式输出日志

日志最终会输出到文件或其他输出流中,这涉及到IO性能。如果采用异步方式,可以显著提高IO性能。8RQ28资讯网——每日最新资讯28at.com

除非有特殊要求,建议使用异步方式输出日志。以logback为例,配置异步非常简单,只需使用AsyncAppender:8RQ28资讯网——每日最新资讯28at.com

<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">    <appender-ref ref="ASYNC"/></appender>

以上配置使用AsyncAppender来实现异步输出日志。8RQ28资讯网——每日最新资讯28at.com

10 禁止在联机环境中启用调试功能

在联机环境中禁用调试功能非常重要。8RQ28资讯网——每日最新资讯28at.com

因为通常系统会有大量的调试日志,各种框架也会大量使用调试日志,在线调试可能会很快填满磁盘,影响业务系统的正常运行。8RQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-57889-0.html十个Java编程中记录日志的小技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Golang流水线设计模式实践

下一篇: 别被前端框架 PUA 了!

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
Top