Logback日志格式优化,解决输出***@2b193f2d问题
原文出处:Java之道
原文地址:http://www.hollischuang.com/archives/3689
我们在开发的时候,经常要打印日志,有的时候会在一些代码的关键节点处进行日志输出。使用logback/log4j等原生的日志框架,在日志输出的时候可能会遇到一个问题,那就是经常我们要打印对象的时候,如以下代码:
log.info("req = {}", aRequest);
打印结果却是以下形式:
req = 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. 定义一个MessageConverter
public class ArgumentJsonFormatLayout extends MessageConverter {
@Override
public 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. 在logbacb的配置文件中加上配置上这个类
<configuration>
……
<conversionRule conversionWord="m" converterClass="com.hollis.java.ways.ArgumentJsonFormatLayout"/>
……
</configuration>
注意:conversionWord里的值m不是随便写的,要和logback里的日志输出格式里的信息参数相同。比如:
[%-5level] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] [%logger.%method:%line] -- %m%n
补充:我在查阅网上资料时,发现很多金融、电商项目会用这个类实现对用户名、密码、交易密码等信息的脱敏处理,也很方便,不过实现逻辑比较复杂,大家可以自己查阅。
补充资料:
https://www.jianshu.com/p/ade8b7c220df
https://blog.csdn.net/fywfengyanwei/article/details/78484590
Logback日志格式优化,解决输出***@2b193f2d问题的更多相关文章
- ELK收集Nginx自定义日志格式输出
1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...
- springboot+logback日志输出企业实践(下)
目录 1.引言 2. 输出 logback 状态数据 3. logback 异步输出日志 3.1 异步输出配置 3.2 异步输出原理 4. springboot 多环境下 logback 配置 5. ...
- SpringBoot系列——Logback日志,输出到文件以及实时输出到web页面
前言 SpringBoot对所有内部日志使用通用日志记录,但保留底层日志实现.为Java Util Logging.Log4J2和Logback提供了默认配置.在不同的情况下,日志记录器都预先配置为使 ...
- log4jdbc与logback集合打印日志过多的解决
在项目中使用了log4jdbc,可以很方便的把sql的参数也打印出来,便于问题调试.比如原始sql: select * from t_order where order_id = ? : 经过log4 ...
- MySQL学习笔记(一)Ubuntu16.04中MySQL安装配置(5.6优化、错误日志、DNS解决)
目录 第一部分.5.6安装.配置.自动备份 第二部分.5.7源码安装.配置.自动备份 第一部分.5.6安装 1.安装mysql sudo apt-get install mysql-server su ...
- log4jdbc 与 logback 集合打印日志过多的解决
在项目中使用了log4jdbc,可以很方便的把sql的参数也打印出来,便于问题调试.比如原始sql: select * from t_order where order_id = ? : 经过log4 ...
- [日志] spring boot + logback 日志输出配置
一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...
- springboot+logback日志输出企业实践(上)
目录 1.引言 2.logback简介 3. springboot默认日志框架-logback 3.1 springboot示例工程搭建 3.2 日志输出与基本配置 3.2.1 日志默认输出 3.2. ...
- 【Spring Boot】Spring Boot之利用Logstash将日志转换成以JSON的格式存储和输出
一.Logstash的作用 Logstash是一个完全开源的工具,它可以对日志进行收集.过滤,能非常方便地将日志转换成以JSON的格式存储和输出,并将其存储供以后使用. 二.整合Logstash的步骤 ...
随机推荐
- 阐述Fetch.ai的能源市场优化
原文链接:https://fetch.ai/explaining-fetch-ais-energy-market-optimization/ 阐述Fetch.ai的能源市场优化 2019年11月4日 ...
- Blazor带我重玩前端(三)
写在前面 需要升级VS2019以及.NET Core到最新版(具体的最低支持,我已经忘了,总是越新支持的就越好),以更好的支持自己开发Blazor项目. WebAssembly 搜索Blazor模板 ...
- APP开发---Windows查看端口是否被占用
前言:在后台设计的过程中,当你把后台的代码编辑好之后经常会发现,上传jar包之后,却出现了错误,错误结果显示端口被占用,下面就是如何查看Windows端口是否被占用的方法总结 ------------ ...
- Springboot下实现阿里云短信验证功能(含代码)
Springboot下实现阿里云短信验证功能 一 开通阿里云短信服务 阿里云官网注册登录 找到短信服务并开通 打开短信服务的管理台 在国内消息那栏中添加签名管理和模板管理(按照格式要求去写) 在右上角 ...
- 一、kafka 安装配置
Kafka是什么 Kafka最初是由LinkedIn公司采用Scala语言开发的一个分布式.多分区.多副本且基于ZooKeeper协调的内部基础设置,现已捐献给Apache基金会.Kafka是一个流平 ...
- Oracle表的基本查询
Oracle 分页 1.rownum分页 Select * from emp; Select a1.*,rownum rn from (Select * from emp) a1; 2.显示rownu ...
- MCU 51-3定时器
51定时/计数器简介 51单片机有2个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5).这里所说的16位是指定时/计数器内部分别有16位的计数寄存器. 当工作在定时模式时, ...
- Scala 面向对象(九):特质(接口) 二
1 带有具体实现的特质 说明:和Java中的接口不太一样的是特质中的方法并不一定是抽象的,也可以有非抽象方法(即:实现了的方法). 2 带有特质的对象,动态混入 1)除了可以在类声明时继承特质以外,还 ...
- Mysql基础(七):数据库总结
目录 MySQL数据库06 /数据库总结 1. 数据库/DBMS 2. 数据库分类 3. 修改密码 4. 库操作 5. 表操作 6. 存储引擎 7. 事务 8. 约束 9. 数据类型 10. 单表语句 ...
- flask 源码专题(一):app.run()的背后
当我们用Flask写好一个app后, 运行app.run()表示监听指定的端口, 对收到的request运行app生成response并返回. 现在分析一下, 运行app.run()后具体发生了什么事 ...