log日志中的{}替换参数是怎么解析实现的
用的不是正则、也不是String.format、也就不是Formatter.format
logger.info("aaa{}ccc","bbb","ddd");
public void info(String format, Object arg1, Object arg2) {this.filterAndLog_2(FQCN, (Marker)null, Level.INFO, format, arg1, arg2, (Throwable)null);}
private void filterAndLog_2(String localFQCN, Marker marker, Level level, String msg, Object param1, Object param2, Throwable t) {FilterReply decision = this.loggerContext.getTurboFilterChainDecision_2(marker, this, level, msg, param1, param2, t);if (decision == FilterReply.NEUTRAL) {if (this.effectiveLevelInt > level.levelInt) {return;}} else if (decision == FilterReply.DENY) {return;}this.buildLoggingEventAndAppend(localFQCN, marker, level, msg, new Object[]{param1, param2}, t);}
private void buildLoggingEventAndAppend(String localFQCN, Marker marker, Level level, String msg, Object[] params, Throwable t) {//关键点LoggingEvent le = new LoggingEvent(localFQCN, this, level, msg, t, params);le.setMarker(marker);this.callAppenders(le);}
public String toString() {StringBuilder sb = new StringBuilder();sb.append('[');sb.append(this.level).append("] ");//关键点sb.append(this.getFormattedMessage());return sb.toString();}
public String getFormattedMessage() {if (this.formattedMessage != null) {return this.formattedMessage;} else {if (this.argumentArray != null) {//关键点this.formattedMessage = MessageFormatter.arrayFormat(this.message, this.argumentArray).getMessage();} else {this.formattedMessage = this.message;}return this.formattedMessage;}}
static final String DELIM_STR = "{}";
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argArray);Object[] args = argArray;if (throwableCandidate != null) {args = MessageFormatter.trimmedCopy(argArray);}return arrayFormat(messagePattern, args, throwableCandidate);}
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
if (messagePattern == null) {return new FormattingTuple(null, argArray, throwable);}if (argArray == null) {return new FormattingTuple(messagePattern);}int i = 0;int j;// use string builder for better multicore performanceStringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);int L;for (L = 0; L < argArray.length; L++) {//看到了么?看到了么?看到了么?j = messagePattern.indexOf(DELIM_STR, i);if (j == -1) {// no more variablesif (i == 0) { // this is a simple stringreturn new FormattingTuple(messagePattern, argArray, throwable);} else { // add the tail string which contains no variables and return// the result.sbuf.append(messagePattern, i, messagePattern.length());return new FormattingTuple(sbuf.toString(), argArray, throwable);}} else {if (isEscapedDelimeter(messagePattern, j)) {if (!isDoubleEscaped(messagePattern, j)) {L--; // DELIM_START was escaped, thus should not be incrementedsbuf.append(messagePattern, i, j - 1);sbuf.append(DELIM_START);i = j + 1;} else {// The escape character preceding the delimiter start is// itself escaped: "abc x:\\{}"// we have to consume one backward slashsbuf.append(messagePattern, i, j - 1);deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());i = j + 2;}} else {// normal casesbuf.append(messagePattern, i, j);deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());i = j + 2;}}}// append the characters following the last {} pair.sbuf.append(messagePattern, i, messagePattern.length());return new FormattingTuple(sbuf.toString(), argArray, throwable);
}
log日志中的{}替换参数是怎么解析实现的相关推荐
- uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。
如果没有设置uwsgi的--listen,如果sysctl -a | grep net.core.somaxconn发现net.core.somaxconn=128. 那你使用uwsgi启动的服务,单 ...
- log日志中不打印异常栈的具体信息
问题与分析 最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定 ...
- clouderamanager-server启动,log日志中说需要mysql驱动的解决办法
service cloudera-scm-server start 会报错,说mysql驱动,下载mysql的jar包 https://dev.mysql.com/downloads/connecto ...
- Tomcat日志记录post请求参数
公司的项目向用户提供接口,但是最近偶尔会出现超时的情况,用户的调用设置的超时时间是1分钟,所以首先要排查代码的执行时间是否超过一分钟 @PostMapping("/updateattachm ...
- python编写脚本方法_使用Python编写提取日志中的中文的脚本的方法
由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提取工具,代替手工提取的繁杂,涉及中文字符,正则表达式不好匹配 ...
- python批量执行linux命令并写入log日志
linux下使用python运行make命令并把日志有错的路径写入.log日志中 #!/usr/bin/python # -*- coding: UTF-8 -*- import subprocess ...
- 如何对系统中设置的修改记录增加log日志
前段时间有个用户打电话给我,苦兮兮的说,他们的自定义的报表版本的内容不知道给谁删除的干干静静,然后咬牙切齿的说,一定要设个blog,抓住这个乱改的家伙. 我给他的答复是,对不起,自定义报表的行列字段修 ...
- log日志java web_Javaweb项目中使用Log4j记录日志
Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI 组件.甚至是套接口服务器.NT 的事件记录器.UNIX Syslog ...
- Golang中log日志包的使用
文章目录 1.前言 2.log包介绍 3.log包的使用 3.1 日志输出方法 3.2 自定义创建日志对象 3.3 封装自定义日志包 3.4 log包进一步解析 1.前言 作为后端开发人员,日志文件记 ...
最新文章
- 用栈、回溯算法设计迷宫程序
- 怎样用c语言写高速超速罚款标准,pta高速公路超速处罚(C语言)
- python 去除字符串里所有标点符号
- python 自然语言处理(二) jieba 分词
- 钱币掉落动画android,mpvue实现小程序签到金币掉落动画(api实现)
- 在大厂做螺丝钉?还是去新赛道攻城略地?看看这届年轻人怎么说
- 解决 SpringBoot 在 JDK8 中 LocalDateTime (反)序列化问题
- JS定时器小应用--设置闹铃
- 【Linux】tee命令
- pythonmooc期末考试编程题_大学moocPython编程基础期末考试搜题公众号答案
- mcuisp下载程序
- WES7 SKU WES7E和WES7P的区别
- 传说中的世界500强面试题-情商
- 高精地图应用(四)横向定位
- 机器学习:决策树的划分依据
- 工业制造中的UWB定位技术
- 电脑录屏快捷键是什么?电脑录屏是什么键
- 问卷中多选题该怎么分析?
- android烤机按键变慢,Android8.0平台Camera monkey拷机卡死异常
- 如何使用VS+C#创建,优雅自动化的安装(不使用命令行),调试,更新Windows服务
热门文章
- 开源android项目到jcenter,手把手教你将Android项目开源到JCenter两种方式以及挖坑和填坑(一)...
- 实验用PHP调用DLL(图文)
- NOKIA手机串号查询方法
- java.security.cert.CertificateException: No name matching https证书验证不通过
- 推荐文章之从技术、平台、工具、语言框架等四大方面,详解技术未来的趋势
- C实现最后一个枪毙谁
- Java之真实项目中的章节排序实例
- 脑残小白上楼梯(递归)
- mysql 修改表字段裂隙_[terry笔记]data guard基础知识
- 华为Mate Xs 2发布,持续引领折叠屏手机创新