in src/main/cpp/xmllayout.cpp [77:176]
void XMLLayout::format(LogString& output,
const spi::LoggingEventPtr& event,
Pool& p) const
{
output.reserve(m_priv->expectedPatternLength + event->getMessage().size());
output.append(LOG4CXX_STR("<log4j:event logger=\""));
Transform::appendEscapingTags(output, event->getLoggerName());
output.append(LOG4CXX_STR("\" timestamp=\""));
StringHelper::toString(event->getTimeStamp() / 1000L, p, output);
output.append(LOG4CXX_STR("\" level=\""));
Transform::appendEscapingTags(output, event->getLevel()->toString());
output.append(LOG4CXX_STR("\" thread=\""));
Transform::appendEscapingTags(output, event->getThreadName());
output.append(LOG4CXX_STR("\">"));
output.append(LOG4CXX_EOL);
output.append(LOG4CXX_STR("<log4j:message><![CDATA["));
// Append the rendered message. Also make sure to escape any
// existing CDATA sections.
Transform::appendEscapingCDATA(output, event->getRenderedMessage());
output.append(LOG4CXX_STR("]]></log4j:message>"));
output.append(LOG4CXX_EOL);
LogString ndc;
if (event->getNDC(ndc))
{
output.append(LOG4CXX_STR("<log4j:NDC><![CDATA["));
Transform::appendEscapingCDATA(output, ndc);
output.append(LOG4CXX_STR("]]></log4j:NDC>"));
output.append(LOG4CXX_EOL);
}
if (m_priv->locationInfo)
{
output.append(LOG4CXX_STR("<log4j:locationInfo class=\""));
const LocationInfo& locInfo = event->getLocationInformation();
LOG4CXX_DECODE_CHAR(className, locInfo.getClassName());
Transform::appendEscapingTags(output, className);
output.append(LOG4CXX_STR("\" method=\""));
LOG4CXX_DECODE_CHAR(method, locInfo.getMethodName());
Transform::appendEscapingTags(output, method);
output.append(LOG4CXX_STR("\" file=\""));
LOG4CXX_DECODE_CHAR(fileName, locInfo.getFileName());
Transform::appendEscapingTags(output, fileName);
output.append(LOG4CXX_STR("\" line=\""));
StringHelper::toString(locInfo.getLineNumber(), p, output);
output.append(LOG4CXX_STR("\"/>"));
output.append(LOG4CXX_EOL);
}
if (m_priv->properties)
{
LoggingEvent::KeySet propertySet(event->getPropertyKeySet());
LoggingEvent::KeySet keySet(event->getMDCKeySet());
if (!(keySet.empty() && propertySet.empty()))
{
output.append(LOG4CXX_STR("<log4j:properties>"));
output.append(LOG4CXX_EOL);
for (auto key : keySet)
{
LogString value;
if (event->getMDC(key, value))
{
output.append(LOG4CXX_STR("<log4j:data name=\""));
Transform::appendEscapingTags(output, key);
output.append(LOG4CXX_STR("\" value=\""));
Transform::appendEscapingTags(output, value);
output.append(LOG4CXX_STR("\"/>"));
output.append(LOG4CXX_EOL);
}
}
for (auto key : propertySet)
{
LogString value;
if (event->getProperty(key, value))
{
output.append(LOG4CXX_STR("<log4j:data name=\""));
Transform::appendEscapingTags(output, key);
output.append(LOG4CXX_STR("\" value=\""));
Transform::appendEscapingTags(output, value);
output.append(LOG4CXX_STR("\"/>"));
output.append(LOG4CXX_EOL);
}
}
output.append(LOG4CXX_STR("</log4j:properties>"));
output.append(LOG4CXX_EOL);
}
}
output.append(LOG4CXX_STR("</log4j:event>"));
output.append(LOG4CXX_EOL);
output.append(LOG4CXX_EOL);
}