org.apache.log4j.xml.XMLLayout Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Contributors: Mathias Bogaert
package org.apache.log4j.xml;
import org.apache.log4j.Layout;
import org.apache.log4j.helpers.Transform;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;
import java.util.Set;
import java.util.Arrays;
/**
* The output of the XMLLayout consists of a series of log4j:event
* elements as defined in the log4j.dtd. It does not output a
* complete well-formed XML file. The output is designed to be
* included as an external entity in a separate file to form
* a correct XML file.
*
* For example, if abc
is the name of the file where
* the XMLLayout ouput goes, then a well-formed XML file would be:
*
<?xml version="1.0" ?>
<!DOCTYPE log4j:eventSet PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd" [<!ENTITY data SYSTEM "abc">]>
<log4j:eventSet version="1.2" xmlns:log4j="http://jakarta.apache.org/log4j/">
&data;
</log4j:eventSet>
* This approach enforces the independence of the XMLLayout and the
* appender where it is embedded.
*
*
The version
attribute helps components to correctly
* intrepret output generated by XMLLayout. The value of this
* attribute should be "1.1" for output generated by log4j versions
* prior to log4j 1.2 (final release) and "1.2" for relase 1.2 and
* later.
*
* Appenders using this layout should have their encoding
* set to UTF-8 or UTF-16, otherwise events containing
* non ASCII characters could result in corrupted
* log files.
*
* @author Ceki Gülcü
* @since 0.9.0
* */
public class XMLLayout extends Layout {
private final int DEFAULT_SIZE = 256;
private final int UPPER_LIMIT = 2048;
private StringBuffer buf = new StringBuffer(DEFAULT_SIZE);
private boolean locationInfo = false;
private boolean properties = false;
/**
* The LocationInfo option takes a boolean value. By default,
* it is set to false which means there will be no location
* information output by this layout. If the the option is set to
* true, then the file name and line number of the statement at the
* origin of the log statement will be output.
*
*
If you are embedding this layout within an {@link
* org.apache.log4j.net.SMTPAppender} then make sure to set the
* LocationInfo option of that appender as well.
* */
public void setLocationInfo(boolean flag) {
locationInfo = flag;
}
/**
Returns the current value of the LocationInfo option.
*/
public boolean getLocationInfo() {
return locationInfo;
}
/**
* Sets whether MDC key-value pairs should be output, default false.
* @param flag new value.
* @since 1.2.15
*/
public void setProperties(final boolean flag) {
properties = flag;
}
/**
* Gets whether MDC key-value pairs should be output.
* @return true if MDC key-value pairs are output.
* @since 1.2.15
*/
public boolean getProperties() {
return properties;
}
/** No options to activate. */
public void activateOptions() {
}
/**
* Formats a {@link org.apache.log4j.spi.LoggingEvent} in conformance with the log4j.dtd.
* */
public String format(final LoggingEvent 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 StringBuffer(DEFAULT_SIZE);
} else {
buf.setLength(0);
}
// We yield to the \r\n heresy.
buf.append("\r\n");
buf.append(" \r\n");
String ndc = event.getNDC();
if(ndc != null) {
buf.append(" \r\n");
}
String[] s = event.getThrowableStrRep();
if(s != null) {
buf.append(" \r\n");
}
if(locationInfo) {
LocationInfo locationInfo = event.getLocationInformation();
buf.append(" \r\n");
}
if (properties) {
Set keySet = event.getPropertyKeySet();
if (keySet.size() > 0) {
buf.append("\r\n");
Object[] keys = keySet.toArray();
Arrays.sort(keys);
for (int i = 0; i < keys.length; i++) {
String key = keys[i].toString();
Object val = event.getMDC(key);
if (val != null) {
buf.append(" \r\n");
}
}
buf.append(" \r\n");
}
}
buf.append(" \r\n\r\n");
return buf.toString();
}
/**
The XMLLayout prints and does not ignore exceptions. Hence the
return value false
.
*/
public boolean ignoresThrowable() {
return false;
}
}