The Apache Log4j 1.x Compatibility API providing a bridge to Log4j 2.x implementations
—
Layouts control how log messages are formatted for output. The compatibility API provides pattern-based formatting, simple layouts, and extensible custom layout capabilities.
public abstract class Layout {
// Line separator constants
public static final String LINE_SEP;
public static final int LINE_SEP_LEN;
// Abstract methods to implement
public abstract String format(LoggingEvent event);
public abstract boolean ignoresThrowable();
// Optional methods
public String getContentType();
public String getHeader();
public String getFooter();
// Lifecycle
public void activateOptions();
}Parameters:
event - LoggingEvent to formatReturns:
String formatted message, content type, header, or footerboolean indicating if throwable information is ignoredpublic class PatternLayout extends Layout {
// Default patterns
public static final String DEFAULT_CONVERSION_PATTERN = "%m%n";
public static final String TTCC_CONVERSION_PATTERN = "%r [%t] %p %c %x - %m%n";
// Constructors
public PatternLayout();
public PatternLayout(String pattern);
// Pattern management
public String getConversionPattern();
public void setConversionPattern(String conversionPattern);
// Layout implementation
public String format(LoggingEvent event);
public boolean ignoresThrowable();
public void activateOptions();
}Parameters:
pattern - String conversion patternconversionPattern - String pattern to setevent - LoggingEvent to formatReturns:
String current conversion pattern or formatted messageboolean always returns true (ignores throwable)The PatternLayout uses conversion patterns with the following specifiers:
| Specifier | Description | Example |
|---|---|---|
%c | Category/Logger name | com.myapp.MyClass |
%C | Fully qualified class name | com.myapp.MyClass |
%d | Date/time | 2023-10-15 14:30:25,123 |
%F | File name | MyClass.java |
%l | Location information | com.myapp.MyClass.method(MyClass.java:42) |
%L | Line number | 42 |
%m | Application message | User logged in |
%M | Method name | loginUser |
%n | Platform-specific line separator | \n or \r\n |
%p | Priority/Level | INFO, ERROR |
%r | Milliseconds since startup | 1234 |
%t | Thread name | main, pool-1-thread-1 |
%x | NDC (Nested Diagnostic Context) | operation.subop |
%X | MDC (Mapped Diagnostic Context) | {userId=123, sessionId=abc} |
| Modifier | Description | Example |
|---|---|---|
%-5p | Left-align in 5 characters | INFO |
%5p | Right-align in 5 characters | INFO |
%.10c | Truncate to 10 characters | com.myapp |
%20.30c | Min 20, max 30 characters | Padded or truncated |
%c{1} | Show only last component | MyClass |
%c{2} | Show last 2 components | myapp.MyClass |
| Pattern | Description | Example |
|---|---|---|
%d | Default format | 15 Oct 2023 14:30:25,123 |
%d{ISO8601} | ISO 8601 format | 2023-10-15 14:30:25,123 |
%d{ABSOLUTE} | Absolute time | 14:30:25,123 |
%d{DATE} | Date format | 15 Oct 2023 14:30:25,123 |
%d{dd MMM yyyy HH:mm:ss,SSS} | Custom format | 15 Oct 2023 14:30:25,123 |
public class SimpleLayout extends Layout {
// Constructor
public SimpleLayout();
// Layout implementation
public String format(LoggingEvent event);
public boolean ignoresThrowable();
}Parameters:
event - LoggingEvent to formatReturns:
String formatted as "LEVEL - message\n"boolean always returns true (ignores throwable)public class HTMLLayout extends Layout {
// Constructor
public HTMLLayout();
// Layout implementation
public String format(LoggingEvent event);
public boolean ignoresThrowable();
public String getContentType();
public String getHeader();
public String getFooter();
// Configuration
public boolean getLocationInfo();
public void setLocationInfo(boolean flag);
public String getTitle();
public void setTitle(String title);
}Parameters:
event - LoggingEvent to formatflag - Boolean to enable/disable location infotitle - String title for HTML documentReturns:
String HTML-formatted message, content type, header, or footerboolean always returns true (ignores throwable)public class XMLLayout extends Layout {
// Constructor
public XMLLayout();
// Layout implementation
public String format(LoggingEvent event);
public boolean ignoresThrowable();
public String getContentType();
public String getHeader();
public String getFooter();
// Configuration
public boolean getLocationInfo();
public void setLocationInfo(boolean flag);
public boolean getProperties();
public void setProperties(boolean flag);
}Parameters:
event - LoggingEvent to formatflag - Boolean to enable location info or propertiesReturns:
String XML-formatted message, content type, header, or footerboolean location info or properties settingpublic class TTCCLayout extends DateLayout {
// Constructor
public TTCCLayout();
public TTCCLayout(String dateFormatType);
// Layout implementation
public String format(LoggingEvent event);
public boolean ignoresThrowable();
// Configuration
public boolean getThreadPrinting();
public void setThreadPrinting(boolean threadPrinting);
public boolean getCategoryPrefixing();
public void setCategoryPrefixing(boolean categoryPrefixing);
public boolean getContextPrinting();
public void setContextPrinting(boolean contextPrinting);
}Parameters:
dateFormatType - String date format typeevent - LoggingEvent to formatthreadPrinting - Boolean to enable thread printingcategoryPrefixing - Boolean to enable category prefixingcontextPrinting - Boolean to enable context printingReturns:
String formatted message in TTCC formatboolean configuration settingsimport org.apache.log4j.*;
public class PatternLayoutExample {
public void setupPatternLayouts() {
Logger logger = Logger.getLogger(PatternLayoutExample.class);
// Simple pattern
PatternLayout simplePattern = new PatternLayout("%d %-5p %c - %m%n");
ConsoleAppender console1 = new ConsoleAppender(simplePattern);
// Detailed pattern with location info
PatternLayout detailedPattern = new PatternLayout(
"%d{ISO8601} [%t] %-5p %c{1} %M:%L - %m%n"
);
ConsoleAppender console2 = new ConsoleAppender(detailedPattern);
// Pattern with MDC and NDC
PatternLayout contextPattern = new PatternLayout(
"%d{HH:mm:ss,SSS} [%t] %-5p %c - %X{userId} %x - %m%n"
);
ConsoleAppender console3 = new ConsoleAppender(contextPattern);
logger.addAppender(console1);
}
}import org.apache.log4j.*;
public class DatePatternExample {
public void setupDatePatterns() {
// ISO 8601 format
PatternLayout isoPattern = new PatternLayout("%d{ISO8601} - %m%n");
// Custom date format
PatternLayout customPattern = new PatternLayout(
"%d{dd/MM/yyyy HH:mm:ss.SSS} [%p] %c - %m%n"
);
// Absolute time only
PatternLayout timeOnlyPattern = new PatternLayout("%d{ABSOLUTE} - %m%n");
// Multiple appenders with different date formats
FileAppender fileAppender = new FileAppender(isoPattern, "app.log");
ConsoleAppender consoleAppender = new ConsoleAppender(customPattern);
Logger logger = Logger.getRootLogger();
logger.addAppender(fileAppender);
logger.addAppender(consoleAppender);
}
}import org.apache.log4j.*;
public class SimpleLayoutExample {
public void setupSimpleLayout() {
// Create simple layout
SimpleLayout layout = new SimpleLayout();
// Create appender with simple layout
ConsoleAppender appender = new ConsoleAppender(layout);
appender.setName("simple-console");
// Add to logger
Logger logger = Logger.getLogger("simple");
logger.addAppender(appender);
logger.setLevel(Level.INFO);
// Log messages will appear as: "INFO - Your message"
logger.info("This is an info message");
logger.error("This is an error message");
}
}import org.apache.log4j.*;
import java.io.IOException;
public class HTMLLayoutExample {
public void setupHTMLLayout() throws IOException {
// Create HTML layout
HTMLLayout layout = new HTMLLayout();
layout.setTitle("Application Log");
layout.setLocationInfo(true);
// Create file appender with HTML layout
FileAppender appender = new FileAppender(layout, "app.html");
appender.setName("html-file");
// Add to logger
Logger logger = Logger.getLogger("html");
logger.addAppender(appender);
logger.setLevel(Level.DEBUG);
// Messages will be formatted as HTML table rows
logger.info("Application started");
logger.debug("Debug information");
}
}import org.apache.log4j.*;
import java.io.IOException;
public class XMLLayoutExample {
public void setupXMLLayout() throws IOException {
// Create XML layout
XMLLayout layout = new XMLLayout();
layout.setLocationInfo(true);
layout.setProperties(true);
// Create file appender with XML layout
FileAppender appender = new FileAppender(layout, "app.xml");
appender.setName("xml-file");
// Add to logger
Logger logger = Logger.getLogger("xml");
logger.addAppender(appender);
// Messages will be formatted as XML elements
logger.info("Application event");
logger.warn("Warning message");
}
}import org.apache.log4j.Layout;
import org.apache.log4j.spi.LoggingEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomLayout extends Layout {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private boolean includeLocation = false;
public CustomLayout() {
super();
}
public CustomLayout(boolean includeLocation) {
this.includeLocation = includeLocation;
}
public boolean getIncludeLocation() {
return includeLocation;
}
public void setIncludeLocation(boolean includeLocation) {
this.includeLocation = includeLocation;
}
@Override
public String format(LoggingEvent event) {
StringBuilder sb = new StringBuilder();
// Add timestamp
sb.append("[").append(dateFormat.format(new Date(event.timeStamp))).append("] ");
// Add level
sb.append(event.getLevel().toString()).append(" ");
// Add logger name
sb.append(event.getLoggerName()).append(" ");
// Add location if enabled
if (includeLocation && event.getLocationInformation() != null) {
sb.append("(").append(event.getLocationInformation().getClassName());
sb.append(".").append(event.getLocationInformation().getMethodName());
sb.append(":").append(event.getLocationInformation().getLineNumber()).append(") ");
}
// Add message
sb.append("- ").append(event.getRenderedMessage());
// Add line separator
sb.append(LINE_SEP);
return sb.toString();
}
@Override
public boolean ignoresThrowable() {
return false; // We handle throwables
}
@Override
public void activateOptions() {
// No options to activate in this simple example
}
}import org.apache.log4j.*;
public class LayoutConfigurationExample {
public void setupMultipleLayouts() {
Logger logger = Logger.getLogger("multi-layout");
// Console with simple format
PatternLayout consoleLayout = new PatternLayout("%-5p %c{1} - %m%n");
ConsoleAppender consoleAppender = new ConsoleAppender(consoleLayout);
// File with detailed format
PatternLayout fileLayout = new PatternLayout(
"%d{ISO8601} [%t] %-5p %c %M:%L - %m%n"
);
FileAppender fileAppender;
try {
fileAppender = new FileAppender(fileLayout, "detailed.log");
logger.addAppender(fileAppender);
} catch (Exception e) {
System.err.println("Failed to create file appender: " + e.getMessage());
}
// HTML for web viewing
HTMLLayout htmlLayout = new HTMLLayout();
htmlLayout.setTitle("Application Events");
htmlLayout.setLocationInfo(true);
FileAppender htmlAppender;
try {
htmlAppender = new FileAppender(htmlLayout, "events.html");
logger.addAppender(htmlAppender);
} catch (Exception e) {
System.err.println("Failed to create HTML appender: " + e.getMessage());
}
logger.addAppender(consoleAppender);
logger.setLevel(Level.DEBUG);
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-apache-logging-log4j--log4j-1-2-api