如何使用Spring Sleuth记录MDC?

时间:2017-05-04 16:02:07

标签: spring-boot slf4j spring-cloud-sleuth

我有一个Spring启动+基于侦探的应用程序。一切都按预期工作。我现在有这样的日志:

2017-05-04 17:55:52.226  INFO [alert,692d0eeca479e216,c3c8b680dc29ad02,false] 17292 --- [cTaskExecutor-1] c.k.a.b.s.alert.impl.AlertServiceImpl    : Alert state to process: xxx

现在,我想将自定义MDC添加到我的日志中,例如合同参考。我希望有这样的日志:

2017-05-04 17:55:52.226  INFO [alert,692d0eeca479e216,c3c8b680dc29ad02,false] [CONTRACT_REF] 17292 --- [cTaskExecutor-1] c.k.a.b.s.alert.impl.AlertServiceImpl    : Alert state to process: xxx

我尝试了各种各样的事情但没有成功:

  1. 使用Spring Sleuth Tracer添加标签;
  2. 使用MDC.put(xxx,xxx)将logging.pattern.level =%5p%mdc添加到我的application.properties文件
  3. 如何在我的日志中添加自定义MDC /标签?

2 个答案:

答案 0 :(得分:3)

您必须创建自己的SpanLogger实现。最简单的方法是扩展te Slf4jSpanLogger并提供自己的代码来添加/更新和删除MDC上下文中的条目。然后,您可以更改日志记录模式,这样您的日志将包含他们所需的内容。

答案 1 :(得分:0)

通过执行MDC.put("yourCoolKey", "your cool value")(请参阅MDC.put JavaDoc),我能够相当容易地将数据添加到MDC。

一旦将put的值MDC放入%X{yourCoolKey},就可以在日志记录模式中使用序列logging.pattern.console(在我的情况下为"your cool value")进行打印字符串:-<defaultValue>作为每个log语句的一部分。

(可选)您可以在模式字符串中指定默认值,方法是在键之后添加%X{yourCoolKey:-N/A},例如"N/A",这将在MDC不包含字符串时打印字符串"yourCoolKey"""的条目。如果未指定,则默认值为空白字符串(public boolean writeXMLfile(ApplyLieuDto lieuDto) { boolean isAdded = false; String filePath = "file.xml"; DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document doc = documentBuilder.parse(filePath); NodeList oldList = doc.getElementsByTagName("staff"); int oldListCount = oldList.getLength(); System.out.println("Old List Count Value :: "+oldListCount); Element root = doc.getDocumentElement(); Element rootElement = doc.getDocumentElement(); Collection<ApplyLieuDto> svr = new ArrayList<ApplyLieuDto>(); svr.add(lieuDto); for(ApplyLieuDto lieu : svr) { Element staff = doc.createElement("staff"); rootElement.appendChild(staff); // set attribute to staff element Attr attr = doc.createAttribute("id"); attr.setValue(lieu.getStaffId()); staff.setAttributeNode(attr); Element firstname = doc.createElement("name"); firstname.appendChild(doc.createTextNode(lieu.getName())); staff.appendChild(firstname); // contact number elements Element contact = doc.createElement("contactnumber"); contact.appendChild(doc.createTextNode(lieu.getContact())); staff.appendChild(contact); // email elements Element email = doc.createElement("email"); email.appendChild(doc.createTextNode(lieu.getEmail())); staff.appendChild(email); String satDte = Util.convertUtilDateToString(lieu.getSatDutyDteUtil()); // satdutydate elements Element satDutyDate = doc.createElement("satDte"); satDutyDate.appendChild(doc.createTextNode(satDte)); staff.appendChild(satDutyDate); // satdutydateAMPM elements Element satDutyDateAMPM = doc.createElement("satDteAMPM"); satDutyDateAMPM.appendChild(doc.createTextNode(lieu.getSatDutyDteAmPm())); staff.appendChild(satDutyDateAMPM); String offDte = Util.convertUtilDateToString(lieu.getOffDteUtil()); // offDate elements Element offDat = doc.createElement("offdate"); offDat.appendChild(doc.createTextNode(offDte)); staff.appendChild(offDat); // offDateAMPM elements Element offDatAMPM = doc.createElement("offdateAMPM"); offDatAMPM.appendChild(doc.createTextNode(lieu.getOffDteAmPm())); staff.appendChild(offDatAMPM); // appOfficer elements Element appOfficer = doc.createElement("approvingofficer"); appOfficer.appendChild(doc.createTextNode(lieu.getApprovingOfficer())); staff.appendChild(appOfficer); String modDate = Util.convertUtilDateToString(lieu.getDateUpdateUtil()); // Date elements Element modifieddate = doc.createElement("modifieddate"); modifieddate.appendChild(doc.createTextNode(modDate)); staff.appendChild(modifieddate); // status elements Element status = doc.createElement("status"); status.appendChild(doc.createTextNode(lieu.getStatus())); staff.appendChild(status); root.appendChild(staff); } DOMSource source = new DOMSource(doc); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); StreamResult result = new StreamResult(filePath); StreamResult strmResult = new StreamResult(System.out); transformer.transform(source, result); transformer.transform(source, strmResult); NodeList newList = doc.getElementsByTagName("staff"); int newListCount = newList.getLength(); System.out.println("New List Count Value :: "+newListCount); if(newListCount > oldListCount) { isAdded = true; } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } return isAdded; } `