iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么正确用Java代码打日志
  • 444
分享到

怎么正确用Java代码打日志

2023-06-02 09:06:15 444人浏览 八月长安
摘要

这篇文章主要讲解了“怎么正确用Java代码打日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么正确用Java代码打日志”吧!使用slf4j使用门面模式的日志框架,有利于维护和各个类的日志

这篇文章主要讲解了“怎么正确用Java代码打日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么正确用Java代码打日志”吧!

使用slf4j

  • 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

  • 实现方式统一使用: Logback框架

打日志的正确方式

什么时候应该打日志

  • 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。

  • 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支

  • 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程

基本格式必须使用参数化信息的方式:

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

对于debug日志,必须判断是否为debug级别后,才进行使用:

if (logger.isDebugEnabled()) {
   logger.debug("Processing trade with id: " +id + " symbol: " + symbol);
}

不要进行字符串拼接,那样会产生很多String对象,占用空间,影响性能。反例(不要这么做):

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

使用[]进行参数变量隔离如有参数变量,应该写成如下写法:

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

这样的格式写法,可读性更好,对于排查问题更有帮助。

不同级别的使用

ERROR:基本概念影响到程序正常运行、当前请求正常运行的异常情况:

  • 打开配置文件失败

  • 所有第三方对接的异常(包括第三方返回错误码)

  • 所有影响功能使用的异常,包括:sqlException和除了业务异常之外的所有异常(RuntimeException和Exception)

不应该出现的情况:比如要使用Azure传图片,但是Azure未响应

如果有Throwable信息,需要记录完成的堆栈信息:

log.error("获取用户[{}]的用户信息时出错",userName,e);

说明如果进行了抛出异常操作,请不要记录error日志,由最终处理方进行处理:

反例(不要这么做):

try{
   ....
}catch(Exception ex){
 String errORMessage=String.format("Error while reading information of user [%s]",userName);
 logger.error(errorMessage,ex);
 throw new UserServiceException(errorMessage,ex);
}

WARN基本概念不应该出现但是不影响程序、当前请求正常运行的异常情况:1、有容错机制的时候出现的错误情况2、找不到配置文件,但是系统能自动创建配置文件

即将接近临界值的时候,例如:1、缓存池占用达到警告线

业务异常的记录,比如:1、当接口抛出业务异常时,应该记录此异常

INFO:基本概念系统运行信息1、Service方法中对于系统/业务状态的变更2、主要逻辑中的分步骤

外部接口部分1、客户端请求参数(REST/WS)2、调用第三方时的调用参数和调用结果

说明1、并不是所有的service都进行出入口打点记录,单一、简单service是没有意义的(job除外,job需要记录开始和结束,)。反例(不要这么做):

public List listByBaseType(Integer baseTypeId) {   log.info("开始查询基地");
BaseExample ex=new BaseExample();
BaseExample.Criteria ctr = ex.createCriteria();
ctr.andIsDeleteEqualTo(IsDelete.USE.getValue());
Optionals.doIfPresent(baseTypeId, ctr::andBaseTypeIdEqualTo);
  log.info("查询基地结束");
return baseRepository.selectByExample(ex);}

对于复杂的业务逻辑,需要进行日志打点,以及埋点记录,比如电商系统中的下订单逻辑,以及OrderAction操作(业务状态变更)。3、对于整个系统的提供出的接口(REST/WS),使用info记录入参4、如果所有的service为SOA架构,那么可以看成是一个外部接口提供方,那么必须记录入参。5、调用其他第三方服务时,所有的出参和入参是必须要记录的(因为你很难追溯第三方模块发生的问题)

DEBUG基本概念1、可以填写所有的想知道的相关信息(但不代表可以随便写,debug信息要有意义,最好有相关参数)2、生产环境需要关闭DEBUG信息3、如果在生产情况下需要开启DEBUG,需要使用开关进行管理,不能一直开启。

说明如果代码中出现以下代码,可以进行优化:

//1. 获取用户基本薪资
//2. 获取用户休假情况
//3. 计算用户应得薪资

优化后的代码:

logger.debug("开始获取员工[{}] [{}]年基本薪资",employee,year);
logger.debug("获取员工[{}] [{}]年的基本薪资为[{}]",employee,year,basicSalary);
logger.debug("开始获取员工[{}] [{}]年[{}]月休假情况",employee,year,month);

logger.debug("员工[{}][{}]年[{}]月年假/病假/事假为[{}]/[{}]/[{}]",employee,year,month,annualLeaveDays,sickLeaveDays,noPayLeaveDays);
logger.debug("开始计算员工[{}][{}]年[{}]月应得薪资",employee,year,month);

logger.debug("员工[{}] [{}]年[{}]月应得薪资为[{}]",employee,year,month,actualSalary);

TRACE基本概念特别详细的系统运行完成信息,业务代码中,不要使用.(除非有特殊用意,否则请使用DEBUG级别替代)

规范示例说明

@Override
@Transactional
public void createUserAndBindMobile(@NotBlank String mobile, @NotNull User user) throws CreateConflictException{
   boolean debug = log.isDebugEnabled();
   if(debug){
       log.debug("开始创建用户并绑定手机号. args[mobile=[{}],user=[{}]]", mobile, LoGobjects.toString(user));
   }
   try {
       user.setCreateTime(new Date());
       user.setUpdateTime(new Date());
       userRepository.insertSelective(user);
       if(debug){
           log.debug("创建用户信息成功. insertedUser=[{}]",LogObjects.toString(user));
       }
       UserMobileRelationship relationship = new UserMobileRelationship();
       relationship.setMobile(mobile);
       relationship.setOpenId(user.getOpenId());
       relationship.setCreateTime(new Date());
       relationship.setUpdateTime(new Date());
       userMobileRelationshipRepository.insertOnDuplicateKey(relationship);
       if(debug){
           log.debug("绑定手机成功. relationship=[{}]",LogObjects.toString(relationship));
       }
       log.info("创建用户并绑定手机号. userId=[{}],openId=[{}],mobile=[{}]",user.getId(),user.getOpenId(),mobile); // 如果考虑安全,手机号记得脱敏
   }catch(DuplicateKeyException e){
       log.info("创建用户并绑定手机号失败,已存在相同的用户. openId=[{}],mobile=[{}]",user.getOpenId(),mobile);
       throw new CreateConflictException("创建用户发生冲突, openid=[%s]",user.getOpenId());
   }
}

感谢各位的阅读,以上就是“怎么正确用Java代码打日志”的内容了,经过本文的学习后,相信大家对怎么正确用Java代码打日志这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么正确用Java代码打日志

本文链接: https://www.lsjlt.com/news/229620.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么正确用Java代码打日志
    这篇文章主要讲解了“怎么正确用Java代码打日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么正确用Java代码打日志”吧!使用slf4j使用门面模式的日志框架,有利于维护和各个类的日志...
    99+
    2023-06-02
  • 怎么在Java代码里正确的打日志
    本篇内容主要讲解“怎么在Java代码里正确的打日志”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Java代码里正确的打日志”吧!打日志的正确方式什么时候应该打日志当你遇到问题的时候,只能通...
    99+
    2023-06-16
  • Java 程序如何正确地打印日志?
    在 Java 开发中,打印日志是一项非常重要的工作。正确的打印日志可以帮助我们快速定位问题,并提高代码的可维护性和可读性。本文将为大家介绍 Java 程序如何正确地打日志,希望对大家有所帮助。 一、为什么需要打印日志 在开发过程中,我们...
    99+
    2023-09-28
    java log4j apache 开发语言 docker
  • Django项目怎么正确配置日志
    这篇文章将为大家详细讲解有关Django项目怎么正确配置日志,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当Django项目正式部署上线后,我们需要设置DEBUG = False。这时开发者应怎样检查Dj...
    99+
    2023-06-14
  • java日志打印怎么使用
    本篇内容介绍了“java日志打印怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介日志打印是java代码开发中不可缺少的重要一步...
    99+
    2023-06-26
  • java怎么打印堆栈日志
    在Java中,可以使用Thread.currentThread().getStackTrace()方法来获取当前线程的堆栈信息,并将...
    99+
    2023-10-23
    java
  • 怎么正确编制ADO.NET代码
    本篇内容介绍了“怎么正确编制ADO.NET代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!(1)打开VS2008,在“服务器资源管理器”下...
    99+
    2023-06-17
  • 如何在Java应用程序中正确配置日志路径?
    作为一名Java程序员,日志是我们不可避免的一部分。正确的配置日志路径可以帮助我们更好地追踪问题和调试代码。在本文中,我们将探讨如何在Java应用程序中正确配置日志路径。 在Java中,我们通常使用Log4j或Logback来记录日志。这两...
    99+
    2023-10-17
    日志 教程 path
  • 怎么用java判断日期格式是否正确
    你可以使用SimpleDateFormat类来判断日期格式是否正确。以下是一个示例: import java.text.ParseE...
    99+
    2023-10-22
    java
  • Java项目中怎么打印错误日志
    这篇文章将为大家详细讲解有关Java项目中怎么打印错误日志,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.上层系统引入的非法参数。对于非法参数引入的错误, 可以通过参数校验和前置条件校验来...
    99+
    2023-06-16
  • java判断时间格式是否正确的代码怎么写
    你可以使用 `SimpleDateFormat` 类来判断时间格式是否正确。下面是一个示例代码:```javaimport java...
    99+
    2023-10-12
    java
  • 如何在Java应用程序中正确地使用重定向日志接口?
    在Java应用程序中,重定向日志接口是非常重要的一个功能。它可以帮助我们更好地管理应用程序的日志,以及确保日志信息能够被正确地保存和处理。在本篇文章中,我们将介绍如何在Java应用程序中正确地使用重定向日志接口。 一、重定向日志接口的基本概...
    99+
    2023-11-05
    重定向 日志 接口
  • springboot2.0整合logback日志的代码怎么写
    这篇文章主要介绍“springboot2.0整合logback日志的代码怎么写”,在日常操作中,相信很多人在springboot2.0整合logback日志的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-29
  • java中println怎么正确使用
    在Java中,`println`是一个用于输出的方法,用于在控制台中打印一行文本。它的正确使用方式如下: 打印字符串: Syst...
    99+
    2023-10-28
    java
  • Java中Log4j日志怎么用
    这篇文章给大家分享的是有关Java中Log4j日志怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么要用日志?我们知道,程序在运行过程中会产生很多很多信息,比如在几点几分的时候运行了,运行的结果是怎么样的...
    99+
    2023-06-29
  • java日志LoggerFactory.getLogger怎么使用
    本篇内容主要讲解“java日志LoggerFactory.getLogger怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java日志LoggerFactory.getLogger怎么使...
    99+
    2023-07-05
  • crontab脚本错误日志怎么正确的输出写入到文件
    这篇文章主要介绍“crontab脚本错误日志怎么正确的输出写入到文件”,在日常操作中,相信很多人在crontab脚本错误日志怎么正确的输出写入到文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”crontab...
    99+
    2023-07-05
  • 使用java注解和aspectj AOP怎么实现打印日志
    本篇文章给大家分享的是有关使用java注解和aspectj AOP怎么实现打印日志,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先需要自定义注解:systemName:表示该...
    99+
    2023-06-06
  • Java中logback日志怎么使用
    小编给大家分享一下Java中logback日志怎么使用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!说明logback作为log4j的替代,有很多优势。要将logback应用到项目中,步骤很简单。加入依赖的jar包和配置文...
    99+
    2023-06-14
  • Java日志组件Logback怎么用
    Java日志组件Logback怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Logback 1.0.1 发布了,这是一个 bugfix 版本,修复了不少的 bug。L...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作