public String doLayout(ILoggingEvent event) {

    // Reset working buffer. If the buffer is too large, then we need a new
    // one in order to avoid the penalty of creating a large array.
    if (buf.capacity() > UPPER_LIMIT) {
      buf = new StringBuilder(DEFAULT_SIZE);
    } else {
      buf.setLength(0);
    }

    // We yield to the \r\n heresy.

    buf.append("<log4j:event logger=\"");
    buf.append(Transform.escapeTags(event.getLoggerName()));
    buf.append("\"\r\n");
    buf.append("             timestamp=\"");
    buf.append(event.getTimeStamp());
    buf.append("\" level=\"");
    buf.append(event.getLevel());
    buf.append("\" thread=\"");
    buf.append(Transform.escapeTags(event.getThreadName()));
    buf.append("\">\r\n");

    buf.append("  <log4j:message>");
    buf.append(Transform.escapeTags(event.getFormattedMessage()));
    buf.append("</log4j:message>\r\n");

    // logback does not support NDC
    // String ndc = event.getNDC();


    IThrowableProxy tp = event.getThrowableProxy();
    if (tp != null) {
      StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
      buf.append("  <log4j:throwable><![CDATA[");
      for (StackTraceElementProxy step : stepArray) {
        buf.append(CoreConstants.TAB);
        buf.append(step.toString());
        buf.append("\r\n");
      }
      buf.append("]]></log4j:throwable>\r\n");
    }

    if (locationInfo) {
      StackTraceElement[] callerDataArray = event.getCallerData();
      if (callerDataArray != null && callerDataArray.length > 0) {
        StackTraceElement immediateCallerData = callerDataArray[0];
        buf.append("  <log4j:locationInfo class=\"");
        buf.append(immediateCallerData.getClassName());
        buf.append("\"\r\n");
        buf.append("                      method=\"");
        buf.append(Transform.escapeTags(immediateCallerData.getMethodName()));
        buf.append("\" file=\"");
        buf.append(Transform.escapeTags(immediateCallerData.getFileName()));
        buf.append("\" line=\"");
        buf.append(immediateCallerData.getLineNumber());
        buf.append("\"/>\r\n");
      }
    }

    /*
     * <log4j:properties> <log4j:data name="name" value="value"/>
     * </log4j:properties>
     */
    if (this.getProperties()) {
      Map<String, String> propertyMap = event.getMDCPropertyMap();

      if ((propertyMap != null) && (propertyMap.size() != 0)) {
        Set<Entry<String, String>> entrySet = propertyMap.entrySet();
        buf.append("  <log4j:properties>");
        for (Entry<String, String> entry : entrySet) {
          buf.append("\r\n    <log4j:data");
          buf.append(" name=\"" + Transform.escapeTags(entry.getKey()) + "\"");
          buf.append(" value=\"" + Transform.escapeTags(entry.getValue()) + "\"");
          buf.append(" />");
        }
        buf.append("\r\n  </log4j:properties>");
      }
    }

    buf.append("\r\n</log4j:event>\r\n\r\n");

    return buf.toString();
  }
public String doLayout ( ILoggingEvent event ) { if ( buf . capacity ( ) > UPPER_LIMIT ) { buf = new StringBuilder ( DEFAULT_SIZE ) ; } else { buf . setLength ( 0 ) ; } buf . append ( "<log4j:event logger=\"" ) ; buf . append ( Transform . escapeTags ( event . getLoggerName ( ) ) ) ; buf . append ( "\"\r\n" ) ; buf . append ( "             timestamp=\"" ) ; buf . append ( event . getTimeStamp ( ) ) ; buf . append ( "\" level=\"" ) ; buf . append ( event . getLevel ( ) ) ; buf . append ( "\" thread=\"" ) ; buf . append ( Transform . escapeTags ( event . getThreadName ( ) ) ) ; buf . append ( "\">\r\n" ) ; buf . append ( "  <log4j:message>" ) ; buf . append ( Transform . escapeTags ( event . getFormattedMessage ( ) ) ) ; buf . append ( "</log4j:message>\r\n" ) ; IThrowableProxy tp = event . getThrowableProxy ( ) ; if ( tp != null ) { StackTraceElementProxy [ ] stepArray = tp . getStackTraceElementProxyArray ( ) ; buf . append ( "  <log4j:throwable><![CDATA[" ) ; for ( StackTraceElementProxy step : stepArray ) { buf . append ( CoreConstants . TAB ) ; buf . append ( step . toString ( ) ) ; buf . append ( "\r\n" ) ; } buf . append ( "]]></log4j:throwable>\r\n" ) ; } if ( locationInfo ) { StackTraceElement [ ] callerDataArray = event . getCallerData ( ) ; if ( callerDataArray != null && callerDataArray . length > 0 ) { StackTraceElement immediateCallerData = callerDataArray [ 0 ] ; buf . append ( "  <log4j:locationInfo class=\"" ) ; buf . append ( immediateCallerData . getClassName ( ) ) ; buf . append ( "\"\r\n" ) ; buf . append ( "                      method=\"" ) ; buf . append ( Transform . escapeTags ( immediateCallerData . getMethodName ( ) ) ) ; buf . append ( "\" file=\"" ) ; buf . append ( Transform . escapeTags ( immediateCallerData . getFileName ( ) ) ) ; buf . append ( "\" line=\"" ) ; buf . append ( immediateCallerData . getLineNumber ( ) ) ; buf . append ( "\"/>\r\n" ) ; } } if ( this . getProperties ( ) ) { Map < String , String > propertyMap = event . getMDCPropertyMap ( ) ; if ( ( propertyMap != null ) && ( propertyMap . size ( ) != 0 ) ) { Set < Entry < String , String > > entrySet = propertyMap . entrySet ( ) ; buf . append ( "  <log4j:properties>" ) ; for ( Entry < String , String > entry : entrySet ) { buf . append ( "\r\n    <log4j:data" ) ; buf . append ( " name=\"" + Transform . escapeTags ( entry . getKey ( ) ) + "\"" ) ; buf . append ( " value=\"" + Transform . escapeTags ( entry . getValue ( ) ) + "\"" ) ; buf . append ( " />" ) ; } buf . append ( "\r\n  </log4j:properties>" ) ; } } buf . append ( "\r\n</log4j:event>\r\n\r\n" ) ; return buf . toString ( ) ; }
Formats a {@link ILoggingEvent} in conformity with the log4j.dtd.