org.apache.log4j.HTMLLayout Maven / Gradle / Ivy
Show all versions of reload4j Show documentation
/*
* 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.
*/
package org.apache.log4j;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.helpers.Transform;
/**
* This layout outputs events in a HTML table.
*
* 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ü
*/
public class HTMLLayout extends Layout {
protected final int BUF_SIZE = 256;
protected final int MAX_CAPACITY = 1024;
static String TRACE_PREFIX = "
";
// output buffer appended to when format() is invoked
private StringBuffer sbuf = new StringBuffer(BUF_SIZE);
/**
* A string constant used in naming the option for setting the the location
* information flag. Current value of this string constant is
* LocationInfo.
*
*
* Note that all option keys are case sensitive.
*
* @deprecated Options are now handled using the JavaBeans paradigm. This
* constant is not longer needed and will be removed in the
* near term.
*
*/
public static final String LOCATION_INFO_OPTION = "LocationInfo";
/**
* A string constant used in naming the option for setting the the HTML document
* title. Current value of this string constant is Title.
*/
public static final String TITLE_OPTION = "Title";
// Print no location info by default
boolean locationInfo = false;
String title = "Log4J Log Messages";
/**
* 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;
}
/**
* The Title option takes a String value. This option sets the document
* title of the generated HTML document.
*
*
* Defaults to 'Log4J Log Messages'.
*/
public void setTitle(String title) {
this.title = title;
}
/**
* Returns the current value of the Title option.
*/
public String getTitle() {
return title;
}
/**
* Returns the content type output by this layout, i.e "text/html".
*/
public String getContentType() {
return "text/html";
}
/**
* No options to activate.
*/
public void activateOptions() {
}
public String format(LoggingEvent event) {
if (sbuf.capacity() > MAX_CAPACITY) {
sbuf = new StringBuffer(BUF_SIZE);
} else {
sbuf.setLength(0);
}
sbuf.append(Layout.LINE_SEP + "
" + Layout.LINE_SEP);
sbuf.append("");
sbuf.append(event.timeStamp - LoggingEvent.getStartTime());
sbuf.append(" " + Layout.LINE_SEP);
String escapedThread = Transform.escapeTags(event.getThreadName());
sbuf.append("");
sbuf.append(escapedThread);
sbuf.append(" " + Layout.LINE_SEP);
sbuf.append("");
if (event.getLevel().equals(Level.DEBUG)) {
sbuf.append("");
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
sbuf.append("");
} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
sbuf.append("");
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
sbuf.append("");
} else {
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
}
sbuf.append(" " + Layout.LINE_SEP);
String escapedLogger = Transform.escapeTags(event.getLoggerName());
sbuf.append("");
sbuf.append(escapedLogger);
sbuf.append(" " + Layout.LINE_SEP);
if (locationInfo) {
LocationInfo locInfo = event.getLocationInformation();
sbuf.append("");
sbuf.append(Transform.escapeTags(locInfo.getFileName()));
sbuf.append(':');
sbuf.append(locInfo.getLineNumber());
sbuf.append(" " + Layout.LINE_SEP);
}
sbuf.append("");
sbuf.append(Transform.escapeTags(event.getRenderedMessage()));
sbuf.append(" " + Layout.LINE_SEP);
sbuf.append(" " + Layout.LINE_SEP);
if (event.getNDC() != null) {
sbuf.append(
"");
sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));
sbuf.append(" " + Layout.LINE_SEP);
}
String[] s = event.getThrowableStrRep();
if (s != null) {
sbuf.append("");
appendThrowableAsHTML(s, sbuf);
sbuf.append(" " + Layout.LINE_SEP);
}
return sbuf.toString();
}
void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {
if (s != null) {
int len = s.length;
if (len == 0)
return;
sbuf.append(Transform.escapeTags(s[0]));
sbuf.append(Layout.LINE_SEP);
for (int i = 1; i < len; i++) {
sbuf.append(TRACE_PREFIX);
sbuf.append(Transform.escapeTags(s[i]));
sbuf.append(Layout.LINE_SEP);
}
}
}
/**
* Returns appropriate HTML headers.
*/
public String getHeader() {
StringBuffer sbuf = new StringBuffer();
sbuf.append(
""
+ Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + title + " " + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("
" + Layout.LINE_SEP);
sbuf.append("Log session start time " + new java.util.Date() + "
" + Layout.LINE_SEP);
sbuf.append("
" + Layout.LINE_SEP);
sbuf.append(""
+ Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("Time " + Layout.LINE_SEP);
sbuf.append("Thread " + Layout.LINE_SEP);
sbuf.append("Level " + Layout.LINE_SEP);
sbuf.append("Category " + Layout.LINE_SEP);
if (locationInfo) {
sbuf.append("File:Line " + Layout.LINE_SEP);
}
sbuf.append("Message " + Layout.LINE_SEP);
sbuf.append(" " + Layout.LINE_SEP);
return sbuf.toString();
}
/**
* Returns the appropriate HTML footers.
*/
public String getFooter() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("
" + Layout.LINE_SEP);
sbuf.append("
" + Layout.LINE_SEP);
sbuf.append("");
return sbuf.toString();
}
/**
* The HTML layout handles the throwable contained in logging events. Hence,
* this method return false
.
*/
public boolean ignoresThrowable() {
return false;
}
}