All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.log4j.xml.XMLLayout Maven / Gradle / Ivy

There is a newer version: 6.1.4
Show newest version
/*
 * 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; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy