我们在开发的时候,经常要打印日志,有的时候会在一些代码的关键节点处进行日志输出。

使用logback/log4j等原生的日志框架,在日志输出的时候可能会遇到一个问题,那就是经常我们要打印对象的时候,如以下代码:

log.info("req = {}", aRequest);

打印结果却是以下形式:

com.hollis.java.ways.ApplyRequest@39ddf169

其实原因比较简单,那就是要打印的对象没有重写toString方法,这样无法将该对象的参数打印出来。

所以,为了可以把对象的值都打印出来,我们一般要求对于自己定义的入参、出参等定义toString方法。

但是有些时候,我们使用的是外部定义的request和response对象,他们并没有覆盖toString,当对这些对象打印的时候,就会出现以上问题。

一般简单的解决办法是,可以通过JSON把对象转成String,如:

log.info("req = {}", JSON.toJSONString(aRequest));

日志输出:

req = {"name":"Hollis","wechat":"hollischuang","javaways":"Java之道"}

但是,这样的话,就需要在每一个日志记录的地方人为的要处理下,很不高效,而且也容易遗忘。

作为程序员,要想办法干掉这种手动操作,有一个好的办法,可以一劳永逸:

借助logback(log4j也有类似的功能)的MessageConverter。无侵入性的解决这个问题

1、自定义一个Layout

/*** 参数JSON格式化类** @author Hollis*/
public class ArgumentJsonFormatLayout extends MessageConverter {@Overridepublic String convert(ILoggingEvent event) {try {return MessageFormatter.arrayFormat(event.getMessage(), Stream.of(event.getArgumentArray()).map(JSON::toJSONString).toArray()).getMessage();} catch (Exception e) {return event.getMessage();}}
}

2、在logback中配置上这个Layout

<configuration><conversionRule conversionWord="m" converterClass="com.hollis.java.ways.ArgumentJsonFormatLayout"/></configuration>

这样,就可以直接使用log.info("req = {}",obj)这样的形式记录日志了。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

日志打印出来的对象都是XXX@39ddf169这样的,怎么办?相关推荐

  1. 前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

    文章目录 6. 控制台打印(Console) 模拟Java日志打印格式 美化对象打印(表格形式打印输出) 日志等级输出(让其在控制台显示时有颜色提示) 代码运行时间统计打印输出   6. 控制台打印( ...

  2. aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析

    java相关:springboot配置aop切面日志打印过程解析 发布于 2020-3-31| 复制链接 摘记: 这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码 ...

  3. java项目日志打印总结

    项目的日志输出 1.关于日志在项目中的logback.xml配置 配置文件内容 <?xml version="1.0" encoding="UTF-8"? ...

  4. 【游戏开发进阶】新发带你玩转Unity日志打印技巧(彩色日志 | 日志存储与上传 | 日志开关 | 日志双击溯源)

    文章目录 一.前言 二.常规日志打印 1.打印Hello World 2.打印任意类型的数据 3.context参数干嘛的 4.格式化输出 三.彩色日志打印 四.日志存储与上传 1.打印日志事件 2. ...

  5. AOP面向切面编程之全局日志打印/统计接口耗时

    目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...

  6. 工作总结:日志打印的15个建议

    前言 日志是快速定位问题的好帮手,是撕逼和甩锅的利器!打印好日志非常重要.今天我们来聊聊日志打印的15个好建议~ 1. 选择恰当的日志级别 常见的日志级别有5种,分别是error.warn.info. ...

  7. 我求求你了,GC日志打印别再瞎配置了

    生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题. 但是可能很多人配置得都不够"完美",要么是打印的内容过少,要么是输出到 ...

  8. 关于日志打印的几点建议以及非最佳实践

    日志的打印在软件开发过程中必不可少,一般分为两个大类: 操作日志 系统日志 操作日志,主要针对的是用户,例如在Photoshop软件中会记录自己操作的步骤,便于用户自己查看. 系统日志,主要针对的是软 ...

  9. 日志打印、main函数中代码执行顺序

    文章目录 1.设置时区 2.日志打印 3.main函数中代码执行顺序 1.设置时区 我们要设置成 CST 时区,以保证正确地显示日期.时间. 我们常看到的时区有如下几个: PST:美国太平洋标准时间, ...

最新文章

  1. 知其然,知其所以然:基于多任务学习的可解释推荐系统
  2. Spring注解创建Bean的几种方式
  3. android Java BASE64编码和解码二:图片的编码和解码
  4. 面试官: 平时开发中你用过读写锁吗?
  5. round()四舍五入方法的简单使用
  6. HP服务器集成 iLO 端口的配置
  7. Xcode 12 to build a single binary with both 32-bit and 64-bit support
  8. C#语句之while语句
  9. java 改变窗口颜色_java窗口背景颜色设置
  10. 摄像模组中光学相关知识(一)
  11. Python基础班就业免费视频教程分享
  12. 学习软件测试必备的网站清单,建议收藏!
  13. 恭贺除夕,没什么才艺展示,就给大家画新年四格小漫画吧 >⌒<
  14. 海天蚝油《挑战不可能》听风者解人声密码
  15. codeforces 418B. Cunning Gena (状态dp)
  16. 【直播升级——AWS 云之旅】
  17. 区块链第一个落地场景,居然是“发票”?
  18. spring常见面试题(2023最新)
  19. cod16显示服务器队列,使命召唤16战区
  20. 怎么辨别一个公司是不是外包?

热门文章

  1. mysql 验证码过期时间_简单的行为控制管理方法,自动登录,session定时验证码过期...
  2. python网球比赛模拟_Python-体育竞技模拟
  3. 计算机a类论文汇报,计算机学院2014年度发表和录用CCFA类、B类论文统计(初稿.xls...
  4. 锁 唤醒_Java笔记|等待唤醒机制
  5. python pandas 排序_Pandas的排序和排名(Series, DataFrame) + groupby
  6. (数据库系统概论|王珊)第四章数据库安全性-第二、三、四、五、六节:数据库安全性控制
  7. (王道408考研数据结构)第五章树-第三节3:线索二叉树
  8. Python-闭包详解
  9. 面试题24. 反转链表
  10. 【CVE-2020-1957】shiro搭配spring时身份验证绕过漏洞分析