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

使用logback/log4j等原生的日志框架,在日志输出的时候可能会遇到一个问题,那就是在打印对象的时候要求对象必须重写toString方法,否则无法将该对象的参数打印出来。

如代码 :log.info("req = {}", creditApplyRequest);

日志输出:

req = com.alibaba.*.request.CreditApplyRequest@39ddf169

我们一般要求对于自己定义的入参、出参等定义toString方法。

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

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

代码 :log.info("req = {}", JSON.toJSONString(ScreditApplyRequest));

日志输出:

req = {"creditInstitution":"SUN","creditRole":"SELLER","customer":{"aliId":372814,"customerId":"372944","customerType":"ALI"},"origin":"PC","productType":"ECREDIT","tenant":"B2B_SUPPLY"}

但是,这样的话,就需要在日志记录的地方人为的要处理下,很不高效。有一个好的办法,可以一劳永逸:

借助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.alibaba.*.ArgumentJsonFormatLayout"/></configuration>

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

无侵入性的在日志中打印对象的关键字段相关推荐

  1. Spring Boot 2.1之后如何在启动日志中打印请求路径列表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  2. 阿里云 EDAS Java服务日志中打印调用链TraceId

    最近要搭建阿里云的日志服务SLS,收集服务日志,进行统一的搜索查询.但遇到一个问题如何在日志中打印链路的TraceId,本文章记录一下对EDAS免费的解决方法. 先看一下阿里官方文档 业务日志关联调用 ...

  3. js给对象添加变量属性 js 更改对象中的属性名 数组对象中每个对象添加一个字段-map用法和forEarch用法

    js给对象添加变量属性 & js 更改对象中的属性名 & 数组对象中每个对象添加一个字段-map用法和forEarch用法 1.js给对象添加变量属性 1.js创建一个对象或者在原有对 ...

  4. mybatis log4j 在日志中打印sql_MyBatis---gt;01总结

    什么是MyBatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML ...

  5. 深入分析Java中打印对象内存地址 System.identityHashCode()方法

    文章目录 地址是什么样子的 toString()方法 重写hashCode identityHashCode与真正的内存地址 参考 地址是什么样子的 我们知道system.out.println(ne ...

  6. JDK8 按List中元素对象的多字段对List进行排序

    利用Java8按照元素对象的多字段对List进行排序 实例对象 public class WarningRule implements Serializable {private String hou ...

  7. java logger的info_logger打印日志(如何打印对象内容)

    在开发中经常要打印日志,但是有些对象如何打印呢,可以使用老土办法,通过toString方法去打印,但是这样太麻烦了.有没有一劳永逸的方法呢.下面就有个例子. 1. 一个最基本的例子 使用Logging ...

  8. javascript中打印对象显示[object object]_js如何打印object对象

    这篇文章主要介绍了js如何打印object对象,需要的朋友可以参考下 js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方 ...

  9. mybatis log4j 在日志中打印sql_SpringBoot整合MyBatis+详细打印执行SQL语句

    图片来源网路 为啥写这篇文章呢,有人可能会说springBoot的mybatis的starter都有了写这篇文章不是多此一举吗?难道是真的吗?其实我一开始也是使用mybatis的starter的,但是 ...

最新文章

  1. Java的13个规范
  2. 表白记 BFS求最短路径
  3. javaweb学习总结(二十九)——EL表达式
  4. [Docker]记一次使用jenkins将镜像文件推送到Harbor遇到的问题
  5. 只针对异常的情况才使用异常_如何以及何时使用异常
  6. w ndows 高级索引,软媒原创:为Windows7建立索引,搜索文件更给力
  7. IDEA编辑器多行编辑模式
  8. Pycharm报错解决:error:please select a valid Python interpreter 及一些基本设置
  9. 拓端tecdat|R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化
  10. 前端(html[5],css[3])学习总结+参考手册下载
  11. huge形式_huge什么意思怎么读
  12. ylbtech-DBD-WeShop(微店)
  13. antd vue 将表格导出为Excel
  14. B+树|MYSQL索引使用原则
  15. 磁条卡磁道2的等效数据
  16. vscode背景图片无法删除
  17. Python文本情感分析实战【源码】
  18. android布局靠底部,android – 使用layout_gravity =“bottom”放置在LinearLayout的底部
  19. Java 多线程实现和尚吃馒头的问题
  20. 实现一个博客系统(前端页面设计)

热门文章

  1. oracle堆表和MySQL_聚簇索引对比|Oracle vs MySQL
  2. 零式机器人_最帅机器人作品“EVA”“天元突破”谁才是男人真正的浪漫
  3. 退出所有循环_Python学习之路9—循环的总结
  4. gtk linux 升级_Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)
  5. c语言运行给拦截了怎么办,[蓝桥杯][算法训练VIP]拦截导弹 (C语言代码)
  6. cxf开发webservice服务端怎么返回固定的报文格式_Spring boot webservice怎么玩? 第277篇...
  7. (数据库系统概论|王珊)第十章数据库恢复技术-第一、二节:事务的基本概念和数据库恢复概述
  8. Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系
  9. HexorBase 登陆、执行语句、数据库帐号密码破解
  10. 一款回到顶部的 jQuery 插件,支持 Div 中的滚动条回到顶部