File Appender in XML (Log4j 2.x)

A File Appender is used in logging frameworks (like Log4j) to write log messages to a file. In Log4j, this can be configured in an XML configuration file, allowing logs to be directed to a specific file on the system.

Example of File Appender in XML (Log4j 2.x):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <!-- Define a File Appender -->
        <File name="FileAppender" fileName="logs/app-log.log">
            <!-- Set the log pattern (log message format) -->
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
        </File>
    </Appenders>

    <!-- Loggers Section -->
    <Loggers>
        <!-- Root logger (applies to all loggers) -->
        <Root level="info">
            <AppenderRef ref="FileAppender"/>
        </Root>
    </Loggers>
</Configuration>

Key Elements in the XML Configuration:

  • <Appenders>: Defines where log messages will be sent. In this case, a File appender is used to write logs to a file.
  • <File>:
    • name="FileAppender": A unique name for the appender.
    • fileName="logs/app-log.log": The path to the file where logs will be written.
  • <PatternLayout>: Defines the format of the log message.
    • %d: Timestamp.
    • [%t]: Thread name.
    • %-5level: Log level (INFO, WARN, ERROR, etc.).
    • %logger{36}: Logger name (up to 36 characters).
    • %msg%n: The actual log message followed by a new line.
  • <Loggers>: Defines which loggers will use the file appender.
    • <Root>: The root logger applies to all loggers unless explicitly specified otherwise.
    • <AppenderRef ref="FileAppender"/>: Tells Log4j to use the FileAppender.

Rolling File Appender Configuration:

You can also use a Rolling File Appender if you want the log file to "roll over" after reaching a certain size or based on time intervals.

Example of RollingFile Appender:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <!-- Rolling File Appender to roll logs based on size -->
        <RollingFile name="RollingFileAppender" fileName="logs/app-log.log"
                     filePattern="logs/app-log-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <DefaultRolloverStrategy max="7"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFileAppender"/>
        </Root>
    </Loggers>
</Configuration>

Explanation:

  • RollingFile: Similar to File, but supports rolling log files.
  • filePattern: Specifies how the log file names will be formatted after rolling (e.g., including date and an index).
  • TimeBasedTriggeringPolicy: Rolls logs based on time (e.g., daily).
  • SizeBasedTriggeringPolicy size="10MB": Rolls logs when they reach 10 MB in size.
  • DefaultRolloverStrategy max="7": Retains up to 7 old log files.

Common Log4j Patterns in <PatternLayout>:

  • %d{ISO8601}: Date in ISO8601 format.
  • %p: Log level (INFO, DEBUG, ERROR, etc.).
  • %m: The log message.
  • %n: Newline character.
  • %c{1}: Logger name (only the first part of the logger name).