用的不是正则、也不是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日志中的{}替换参数是怎么解析实现的相关推荐

  1. uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。

    如果没有设置uwsgi的--listen,如果sysctl -a | grep net.core.somaxconn发现net.core.somaxconn=128. 那你使用uwsgi启动的服务,单 ...

  2. log日志中不打印异常栈的具体信息

    问题与分析 最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定 ...

  3. clouderamanager-server启动,log日志中说需要mysql驱动的解决办法

    service cloudera-scm-server start 会报错,说mysql驱动,下载mysql的jar包 https://dev.mysql.com/downloads/connecto ...

  4. Tomcat日志记录post请求参数

    公司的项目向用户提供接口,但是最近偶尔会出现超时的情况,用户的调用设置的超时时间是1分钟,所以首先要排查代码的执行时间是否超过一分钟 @PostMapping("/updateattachm ...

  5. python编写脚本方法_使用Python编写提取日志中的中文的脚本的方法

    由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提取工具,代替手工提取的繁杂,涉及中文字符,正则表达式不好匹配 ...

  6. python批量执行linux命令并写入log日志

    linux下使用python运行make命令并把日志有错的路径写入.log日志中 #!/usr/bin/python # -*- coding: UTF-8 -*- import subprocess ...

  7. 如何对系统中设置的修改记录增加log日志

    前段时间有个用户打电话给我,苦兮兮的说,他们的自定义的报表版本的内容不知道给谁删除的干干静静,然后咬牙切齿的说,一定要设个blog,抓住这个乱改的家伙. 我给他的答复是,对不起,自定义报表的行列字段修 ...

  8. log日志java web_Javaweb项目中使用Log4j记录日志

    Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI 组件.甚至是套接口服务器.NT 的事件记录器.UNIX Syslog ...

  9. Golang中log日志包的使用

    文章目录 1.前言 2.log包介绍 3.log包的使用 3.1 日志输出方法 3.2 自定义创建日志对象 3.3 封装自定义日志包 3.4 log包进一步解析 1.前言 作为后端开发人员,日志文件记 ...

最新文章

  1. 用栈、回溯算法设计迷宫程序
  2. 怎样用c语言写高速超速罚款标准,pta高速公路超速处罚(C语言)
  3. python 去除字符串里所有标点符号
  4. python 自然语言处理(二) jieba 分词
  5. 钱币掉落动画android,mpvue实现小程序签到金币掉落动画(api实现)
  6. 在大厂做螺丝钉?还是去新赛道攻城略地?看看这届年轻人怎么说
  7. 解决 SpringBoot 在 JDK8 中 LocalDateTime (反)序列化问题
  8. JS定时器小应用--设置闹铃
  9. 【Linux】tee命令
  10. pythonmooc期末考试编程题_大学moocPython编程基础期末考试搜题公众号答案
  11. mcuisp下载程序
  12. WES7 SKU WES7E和WES7P的区别
  13. 传说中的世界500强面试题-情商
  14. 高精地图应用(四)横向定位
  15. 机器学习:决策树的划分依据
  16. 工业制造中的UWB定位技术
  17. 电脑录屏快捷键是什么?电脑录屏是什么键
  18. 问卷中多选题该怎么分析?
  19. android烤机按键变慢,Android8.0平台Camera monkey拷机卡死异常
  20. 如何使用VS+C#创建,优雅自动化的安装(不使用命令行),调试,更新Windows服务

热门文章

  1. 开源android项目到jcenter,手把手教你将Android项目开源到JCenter两种方式以及挖坑和填坑(一)...
  2. 实验用PHP调用DLL(图文)
  3. NOKIA手机串号查询方法
  4. java.security.cert.CertificateException: No name matching https证书验证不通过
  5. 推荐文章之从技术、平台、工具、语言框架等四大方面,详解技术未来的趋势
  6. C实现最后一个枪毙谁
  7. Java之真实项目中的章节排序实例
  8. 脑残小白上楼梯(递归)
  9. mysql 修改表字段裂隙_[terry笔记]data guard基础知识
  10. 华为Mate Xs 2发布,持续引领折叠屏手机创新