The Apache Log4j 1.x Compatibility API providing a bridge to Log4j 2.x implementations
—
Appenders define where log messages are sent, including console output, files, rolling files, and custom destinations. The compatibility API provides full Log4j 1.x appender functionality.
public interface Appender {
// Core appender methods
void doAppend(LoggingEvent event);
void close();
boolean requiresLayout();
// Name management
String getName();
void setName(String name);
// Layout management
Layout getLayout();
void setLayout(Layout layout);
// Error handling
ErrorHandler getErrorHandler();
void setErrorHandler(ErrorHandler eh);
// Filter management
void addFilter(Filter newFilter);
Filter getFilter();
void clearFilters();
}Parameters:
event - LoggingEvent to appendname - String name for the appenderlayout - Layout for message formattingeh - ErrorHandler for error managementnewFilter - Filter to add to filter chainReturns:
String appender nameLayout current layoutErrorHandler current error handlerFilter first filter in chainboolean indicating if layout is requiredpublic abstract class AppenderSkeleton implements Appender, OptionHandler {
// Abstract method to implement
protected abstract void append(LoggingEvent event);
// Configuration
public void activateOptions();
// Name management
public String getName();
public void setName(String name);
// Layout management
public Layout getLayout();
public void setLayout(Layout layout);
// Threshold management
public Priority getThreshold();
public void setThreshold(Priority threshold);
public boolean isAsSevereAsThreshold(Priority priority);
// Error handling
public ErrorHandler getErrorHandler();
public void setErrorHandler(ErrorHandler errorHandler);
// Filter management
public void addFilter(Filter newFilter);
public Filter getFilter();
public void clearFilters();
// Lifecycle
public void close();
public boolean isClosed();
}Parameters:
event - LoggingEvent to processname - String name for appenderlayout - Layout for formattingthreshold - Priority threshold for filteringpriority - Priority to check against thresholderrorHandler - ErrorHandler for error managementnewFilter - Filter to addReturns:
String, Layout, Priority, ErrorHandler, Filter as appropriateboolean for threshold checks and closed statuspublic class ConsoleAppender extends WriterAppender {
// Target constants
public static final String SYSTEM_OUT = "System.out";
public static final String SYSTEM_ERR = "System.err";
// Constructors
public ConsoleAppender();
public ConsoleAppender(Layout layout);
public ConsoleAppender(Layout layout, String target);
// Target management
public String getTarget();
public void setTarget(String value);
// Follow option
public boolean getFollow();
public void setFollow(boolean follow);
// Appender behavior
public boolean requiresLayout();
public void activateOptions();
}Parameters:
layout - Layout for message formattingtarget - Target stream (SYSTEM_OUT or SYSTEM_ERR)value - String target value to setfollow - Boolean indicating if target should be followedReturns:
String current targetboolean follow setting and layout requirementpublic class FileAppender extends WriterAppender {
// Constructors
public FileAppender();
public FileAppender(Layout layout, String filename) throws IOException;
public FileAppender(Layout layout, String filename, boolean append) throws IOException;
// File management
public String getFile();
public void setFile(String file);
public boolean getAppend();
public void setAppend(boolean flag);
// Buffering
public boolean getBufferedIO();
public void setBufferedIO(boolean bufferedIO);
public int getBufferSize();
public void setBufferSize(int bufferSize);
// Lifecycle
public void activateOptions();
protected void closeFile();
protected void setQWForFiles(Writer writer);
// Utility
protected void reset();
protected void writeHeader();
protected void writeFooter();
}Parameters:
layout - Layout for message formattingfilename - String path to log fileappend - Boolean indicating if file should be appended toflag - Boolean append flagbufferedIO - Boolean indicating if IO should be bufferedbufferSize - Integer buffer size in byteswriter - Writer for file outputReturns:
String current filenameboolean append and buffering settingsint buffer sizeThrows:
IOException - When file operations failpublic class RollingFileAppender extends FileAppender {
// Constructors
public RollingFileAppender();
public RollingFileAppender(Layout layout, String filename) throws IOException;
public RollingFileAppender(Layout layout, String filename, boolean append) throws IOException;
// Rolling configuration
public long getMaximumFileSize();
public void setMaximumFileSize(long maxFileSize);
public void setMaxFileSize(String value);
public int getMaxBackupIndex();
public void setMaxBackupIndex(int maxBackups);
// Rolling behavior
public void rollOver();
protected void subAppend(LoggingEvent event);
}Parameters:
layout - Layout for formattingfilename - String path to log fileappend - Boolean append flagmaxFileSize - Long maximum file size in bytesvalue - String representation of max file size (e.g., "10MB")maxBackups - Integer maximum number of backup filesevent - LoggingEvent to appendReturns:
long maximum file sizeint maximum backup indexThrows:
IOException - When file operations failpublic class DailyRollingFileAppender extends FileAppender {
// Date pattern constants
public static final String MONTHLY_ROLLOVER = "'.'yyyy-MM";
public static final String WEEKLY_ROLLOVER = "'.'yyyy-ww";
public static final String DAILY_ROLLOVER = "'.'yyyy-MM-dd";
public static final String TWICE_DAILY_ROLLOVER = "'.'yyyy-MM-dd-a";
public static final String HOURLY_ROLLOVER = "'.'yyyy-MM-dd-HH";
public static final String MINUTELY_ROLLOVER = "'.'yyyy-MM-dd-HH-mm";
// Constructors
public DailyRollingFileAppender();
public DailyRollingFileAppender(Layout layout, String filename, String datePattern) throws IOException;
// Date pattern management
public String getDatePattern();
public void setDatePattern(String pattern);
// Rolling behavior
public void activateOptions();
protected void subAppend(LoggingEvent event);
}Parameters:
layout - Layout for formattingfilename - String path to log filedatePattern - String date pattern for rolling (SimpleDateFormat pattern)pattern - String date pattern to setevent - LoggingEvent to appendReturns:
String current date patternThrows:
IOException - When file operations failpublic class SocketAppender extends AppenderSkeleton {
// Constructors
public SocketAppender();
public SocketAppender(InetAddress address, int port);
public SocketAppender(String host, int port);
// Connection configuration
public String getRemoteHost();
public void setRemoteHost(String host);
public int getPort();
public void setPort(int port);
public int getReconnectionDelay();
public void setReconnectionDelay(int delay);
// Lifecycle
public void activateOptions();
public void close();
public boolean requiresLayout();
// Appending
protected void append(LoggingEvent event);
}Parameters:
address - InetAddress of remote hostport - Integer port numberhost - String hostname or IP addressdelay - Integer reconnection delay in millisecondsevent - LoggingEvent to sendReturns:
String remote hostint port and reconnection delayboolean layout requirement (false)public class WriterAppender extends AppenderSkeleton {
// Constructors
public WriterAppender();
public WriterAppender(Layout layout, Writer writer);
public WriterAppender(Layout layout, OutputStream os);
// Writer management
public void setWriter(Writer writer);
protected void closeWriter();
protected void writeHeader();
protected void writeFooter();
// Encoding
public String getEncoding();
public void setEncoding(String value);
// Immediate flush
public boolean getImmediateFlush();
public void setImmediateFlush(boolean value);
// Appending
protected void append(LoggingEvent event);
protected void subAppend(LoggingEvent event);
// Lifecycle
public void activateOptions();
public void close();
public boolean requiresLayout();
}Parameters:
layout - Layout for formattingwriter - Writer for outputos - OutputStream for outputvalue - String encoding name or boolean immediate flush flagevent - LoggingEvent to appendReturns:
String current encodingboolean immediate flush setting and layout requirementimport org.apache.log4j.*;
public class ConsoleAppenderExample {
public void setupConsoleLogging() {
// Create pattern layout
PatternLayout layout = new PatternLayout("%d{HH:mm:ss} %-5p %c{1} - %m%n");
// Create console appender
ConsoleAppender appender = new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT);
appender.setName("console");
// Add to root logger
Logger rootLogger = Logger.getRootLogger();
rootLogger.addAppender(appender);
rootLogger.setLevel(Level.INFO);
}
}import org.apache.log4j.*;
import java.io.IOException;
public class FileAppenderExample {
public void setupFileLogging() throws IOException {
// Create layout
PatternLayout layout = new PatternLayout("%d{ISO8601} [%t] %-5p %c - %m%n");
// Create file appender
FileAppender appender = new FileAppender(layout, "application.log", true);
appender.setName("file");
appender.setBufferedIO(true);
appender.setBufferSize(8192);
appender.activateOptions();
// Add to logger
Logger logger = Logger.getLogger("com.myapp");
logger.addAppender(appender);
logger.setLevel(Level.DEBUG);
}
}import org.apache.log4j.*;
import java.io.IOException;
public class RollingFileExample {
public void setupRollingFile() throws IOException {
// Create layout
PatternLayout layout = new PatternLayout("%d %p %c - %m%n");
// Create rolling file appender
RollingFileAppender appender = new RollingFileAppender(layout, "app.log", true);
appender.setName("rolling");
appender.setMaxFileSize("10MB");
appender.setMaxBackupIndex(5);
appender.activateOptions();
// Add to root logger
Logger.getRootLogger().addAppender(appender);
}
}import org.apache.log4j.*;
import java.io.IOException;
public class DailyRollingExample {
public void setupDailyRolling() throws IOException {
// Create layout
PatternLayout layout = new PatternLayout("%d{ISO8601} %-5p %c - %m%n");
// Create daily rolling appender
DailyRollingFileAppender appender = new DailyRollingFileAppender(
layout,
"daily.log",
DailyRollingFileAppender.DAILY_ROLLOVER
);
appender.setName("daily");
appender.activateOptions();
// Add to logger
Logger logger = Logger.getLogger("com.myapp.daily");
logger.addAppender(appender);
}
}import org.apache.log4j.*;
import org.apache.log4j.spi.LoggingEvent;
public class CustomAppender extends AppenderSkeleton {
private String customProperty;
public CustomAppender() {
super();
}
public String getCustomProperty() {
return customProperty;
}
public void setCustomProperty(String customProperty) {
this.customProperty = customProperty;
}
@Override
protected void append(LoggingEvent event) {
// Custom appending logic
String message = layout.format(event);
// Process message with custom logic
processMessage(message);
}
@Override
public void close() {
// Cleanup resources
if (this.closed) {
return;
}
this.closed = true;
}
@Override
public boolean requiresLayout() {
return true;
}
private void processMessage(String message) {
// Custom message processing
}
}A special appender that discards all log messages. Useful for silencing specific loggers or during testing.
public class NullAppender extends AppenderSkeleton {
// Constructors
public NullAppender();
// Factory method (preferred)
public static NullAppender getNullAppender();
// Deprecated factory method
@Deprecated
public NullAppender getInstance();
// Inherited methods (all no-op)
public void activateOptions();
protected void append(LoggingEvent event);
public void close();
public void doAppend(LoggingEvent event);
public boolean requiresLayout();
}Parameters:
Returns:
getNullAppender() returns singleton instancerequiresLayout() returns falseUsage Example:
import org.apache.log4j.Logger;
import org.apache.log4j.varia.NullAppender;
public class NullAppenderExample {
public void setupNullAppender() {
Logger logger = Logger.getLogger("noisy.component");
// Use singleton instance (preferred)
logger.addAppender(NullAppender.getNullAppender());
// Or create new instance
logger.addAppender(new NullAppender());
// This logger will now discard all messages
logger.info("This message will be discarded");
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-apache-logging-log4j--log4j-1-2-api