无侵入性的在日志中打印对象的关键字段
我们在开发的时候,经常要打印日志,有的时候会在一些代码的关键节点处进行日志输出。
使用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)
这样的形式记录日志了。
无侵入性的在日志中打印对象的关键字段相关推荐
- Spring Boot 2.1之后如何在启动日志中打印请求路径列表
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...
- 阿里云 EDAS Java服务日志中打印调用链TraceId
最近要搭建阿里云的日志服务SLS,收集服务日志,进行统一的搜索查询.但遇到一个问题如何在日志中打印链路的TraceId,本文章记录一下对EDAS免费的解决方法. 先看一下阿里官方文档 业务日志关联调用 ...
- js给对象添加变量属性 js 更改对象中的属性名 数组对象中每个对象添加一个字段-map用法和forEarch用法
js给对象添加变量属性 & js 更改对象中的属性名 & 数组对象中每个对象添加一个字段-map用法和forEarch用法 1.js给对象添加变量属性 1.js创建一个对象或者在原有对 ...
- mybatis log4j 在日志中打印sql_MyBatis---gt;01总结
什么是MyBatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML ...
- 深入分析Java中打印对象内存地址 System.identityHashCode()方法
文章目录 地址是什么样子的 toString()方法 重写hashCode identityHashCode与真正的内存地址 参考 地址是什么样子的 我们知道system.out.println(ne ...
- JDK8 按List中元素对象的多字段对List进行排序
利用Java8按照元素对象的多字段对List进行排序 实例对象 public class WarningRule implements Serializable {private String hou ...
- java logger的info_logger打印日志(如何打印对象内容)
在开发中经常要打印日志,但是有些对象如何打印呢,可以使用老土办法,通过toString方法去打印,但是这样太麻烦了.有没有一劳永逸的方法呢.下面就有个例子. 1. 一个最基本的例子 使用Logging ...
- javascript中打印对象显示[object object]_js如何打印object对象
这篇文章主要介绍了js如何打印object对象,需要的朋友可以参考下 js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方 ...
- mybatis log4j 在日志中打印sql_SpringBoot整合MyBatis+详细打印执行SQL语句
图片来源网路 为啥写这篇文章呢,有人可能会说springBoot的mybatis的starter都有了写这篇文章不是多此一举吗?难道是真的吗?其实我一开始也是使用mybatis的starter的,但是 ...
最新文章
- Java的13个规范
- 表白记 BFS求最短路径
- javaweb学习总结(二十九)——EL表达式
- [Docker]记一次使用jenkins将镜像文件推送到Harbor遇到的问题
- 只针对异常的情况才使用异常_如何以及何时使用异常
- w ndows 高级索引,软媒原创:为Windows7建立索引,搜索文件更给力
- IDEA编辑器多行编辑模式
- Pycharm报错解决:error:please select a valid Python interpreter 及一些基本设置
- 拓端tecdat|R语言、SAS潜类别(分类)轨迹模型LCTM分析体重指数 (BMI)数据可视化
- 前端(html[5],css[3])学习总结+参考手册下载
- huge形式_huge什么意思怎么读
- ylbtech-DBD-WeShop(微店)
- antd vue 将表格导出为Excel
- B+树|MYSQL索引使用原则
- 磁条卡磁道2的等效数据
- vscode背景图片无法删除
- Python文本情感分析实战【源码】
- android布局靠底部,android – 使用layout_gravity =“bottom”放置在LinearLayout的底部
- Java 多线程实现和尚吃馒头的问题
- 实现一个博客系统(前端页面设计)
热门文章
- oracle堆表和MySQL_聚簇索引对比|Oracle vs MySQL
- 零式机器人_最帅机器人作品“EVA”“天元突破”谁才是男人真正的浪漫
- 退出所有循环_Python学习之路9—循环的总结
- gtk linux 升级_Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)
- c语言运行给拦截了怎么办,[蓝桥杯][算法训练VIP]拦截导弹 (C语言代码)
- cxf开发webservice服务端怎么返回固定的报文格式_Spring boot webservice怎么玩? 第277篇...
- (数据库系统概论|王珊)第十章数据库恢复技术-第一、二节:事务的基本概念和数据库恢复概述
- Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系
- HexorBase 登陆、执行语句、数据库帐号密码破解
- 一款回到顶部的 jQuery 插件,支持 Div 中的滚动条回到顶部