Log4j 2 - RollingFileAppender example 日志分割

本文介绍如何使用Log4j2的滚动文件追加器根据日期、文件大小及Cron表达式进行日志文件的归档和压缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

echnologies used:   Java SE 1.8 | Log4j 2.8.2 | Maven 3.3.9 | Jackson API 2.8.7 | Eclipse Neon.3

RollingFileAppender is a file appender which rolls over the log files once it has reached a certain size limit or date/time pattern no longer applies.

In this post, I will show you how to use the RollingFileAppender to backup and compress the old log files based on - 

Jar dependencies

Edit pom.xml file and add log4j2 and Jackson API dependencies in it.

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.2</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.2</version>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.7</version>
  </dependency>

  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.7</version>
  </dependency>

  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.7</version>
  </dependency>
</dependencies>

Rolling based on Date and Time

You can use the TimeBasedTriggeringPolicy to rollover the log file based on the date and time pattern used in <FilePattern/>element as follows.

<RollingFile name="RollingFile">
  <FileName>C:/log/mylog.log</FileName>
  <FilePattern>C:/log/time-based-logs/%d{yyyy-MM-dd-hh-mm}.log.zip</FilePattern>
  <PatternLayout>
    <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy interval="2" modulate="true" />
  </Policies>
  <DefaultRolloverStrategy max="5" />
</RollingFile>

Here are sample date/time patterns for rolling of files base on date/time.

DATE/TIME Pattern Description Intervale Attribute Example
%d{yyyy-MM-dd-hh-mm}.log.zip Roll the log files every minutes

If interval=2, rollovers will occur every 2nd minutes.

E.g. - 2017-07-26-09-57.log.zip2017-07-26-09-59.log.zip2017-07-26-10-01.log.zip2017-07-26-10-03.log.zip etc..

%d{yyyy-MM-dd-hh}.log.zip Roll the log files hourly

If interval=4, rollovers will occur every 4 hours.

E.g. - 2017-07-26-09.log.zip2017-07-26-10.log.zip2017-07-26-11.log.zip etc..

%d{yyyy-MM-dd}.log.zip Roll the log files daily

If interval=1, rollovers will occur every day.

E.g. - 2017-07-26.log.zip2017-07-27.log.zip etc..

The following is the complete example of log4j2.xml file for rolling files every 2nd minutes.

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>

    <!-- Console Appender -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" />
    </Console>

    <!-- Rolling File Appender -->
    <RollingFile name="RollingFile">
      <FileName>C:/log/mylog.log</FileName>
      <FilePattern>C:/log/time-based-logs/%d{yyyy-MM-dd-hh-mm}.log.zip</FilePattern>
      <PatternLayout>
        <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="2" modulate="true" />
      </Policies>
      <DefaultRolloverStrategy max="5" />
    </RollingFile>

  </Appenders>
  <Loggers>
    <Logger name="com.boraji.tutorial.log4j2" level="debug" additivity="false">
      <AppenderRef ref="RollingFile" />
      <AppenderRef ref="Console" />
    </Logger>
    <Root level="trace">
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>

The <DefaultRolloverStrategy> element define a rollover strategy that will keep up to 5 files before removing them.

A simple Java program to test the above log4j 2 configuration.

MainApp.java

package com.boraji.tutorial.log4j2;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MainApp {

   private static final Logger logger = LogManager.getLogger(MainApp.class);

   public static void main(String[] args) {

      for (int i = 0; i < 10000; i++) {
         logger.info("Rolling file appender example...");
         try {
            Thread.sleep(500);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }

   }
}

 

Rolling based on size of file

You can use the SizeBasedTriggeringPolicy to rollover the log file based on the size of file as follows.

<RollingFile name="RollingFile">
  <FileName>C:/log/mylog.log</FileName>
  <FilePattern>C:/log/size-based-logs/%d{yyyy-MM-dd-hh}-%i.log.zip</FilePattern>
  <PatternLayout>
    <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
  </PatternLayout>
  <Policies>
    <SizeBasedTriggeringPolicy size="10 KB"/>
  </Policies>
  <DefaultRolloverStrategy max="5" />
</RollingFile>

You can specify the size of file in bytes, with the suffix KB, MB or GB.

Here is the complete log4j2.xml file for rolling files based on the specified size in <SizeBasedTriggeringPolicy/> element.

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>

    <!-- Console Appender -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" />
    </Console>

    <!-- Rolling File Appender -->
    <RollingFile name="RollingFile">
      <FileName>C:/log/mylog.log</FileName>
      <FilePattern>C:/log/size-based-logs/%d{yyyy-MM-dd-hh}-%i.log.zip</FilePattern>
      <PatternLayout>
        <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
      </PatternLayout>
      <Policies>
        <SizeBasedTriggeringPolicy size="10 KB" />
      </Policies>
      <DefaultRolloverStrategy max="5" />
    </RollingFile>

  </Appenders>
  <Loggers>
    <Logger name="com.boraji.tutorial.log4j2" level="debug" additivity="false">
      <AppenderRef ref="RollingFile" />
      <AppenderRef ref="Console" />
    </Logger>
    <Root level="trace">
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>

The following is a simple java program to test the above log4j2.xml configuration.

package com.boraji.tutorial.log4j2;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MainApp {

   private static final Logger logger = LogManager.getLogger(MainApp.class);

   public static void main(String[] args) {

      for (int i = 0; i < 50000; i++) {
         logger.info("Rolling file appender example...");
      }

   }
}

Rolling based on cron expression

You can use the CronTriggeringPolicy to rollover the log file based on the specified cron expression as follows.

<RollingFile name="RollingFile">
  <FileName>C:/log/mylog.log</FileName>
  <FilePattern>C:/log/cron-based-logs/%d{yyyy-MM-dd-hh-mm}-%i.log.zip</FilePattern>
  <PatternLayout>
    <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
  </PatternLayout>
  <Policies>
    <CronTriggeringPolicy schedule="0 0/2 * 1/1 * ? *" />
  </Policies>
  <DefaultRolloverStrategy max="5" />
</RollingFile>

The following is the complete log4j2.xml file, which trigger rollover after every 2nd minutes as specified in schedule attribute of<CronTriggeringPolicy/> element by cron expression.

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>

    <!-- Console Appender -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" />
    </Console>

    <!-- Rolling File Appender -->
    <RollingFile name="RollingFile">
      <FileName>C:/log/mylog.log</FileName>
      <FilePattern>C:/log/cron-based-logs/%d{yyyy-MM-dd-hh-mm}-%i.log.zip</FilePattern>
      <PatternLayout>
        <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
      </PatternLayout>
      <Policies>
        <CronTriggeringPolicy schedule="0 0/2 * 1/1 * ? *" />
      </Policies>
      <DefaultRolloverStrategy max="5" />
    </RollingFile>

  </Appenders>
  <Loggers>
    <Logger name="com.boraji.tutorial.log4j2" level="debug" additivity="false">
      <AppenderRef ref="RollingFile" />
      <AppenderRef ref="Console" />
    </Logger>
    <Root level="trace">
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>

The following is a simple java program to test the above log4j2.xml configuration.

package com.boraji.tutorial.log4j2;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MainApp {

   private static final Logger logger = LogManager.getLogger(MainApp.class);

   public static void main(String[] args) {

      for (int i = 0; i < 1000; i++) {
         logger.info("Rolling file appender example...");
         try {
            Thread.sleep(1000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }

   }
}https://www.boraji.com/log4j-2-rollingfileappender-example

log4j2 无法进行网络请求的情况下,可以通过配置本地日志处理机制来确保日志的正常记录和输出。log4j2 本身支持多种本地日志输出方式,包括文件、控制台、以及本地数据库等,无需依赖网络连接。 ### 本地日志处理配置方法 #### 1. 使用文件输出日志 log4j2 支持将日志信息写入到本地文件中,这是最常见的本地日志处理方式。通过 `RollingFileAppender` 可以实现日志文件的滚动策略,例如按时间或文件大小进行分割。 ```xml <Configuration status="WARN"> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="10 MB" /> </Policies> </RollingFile> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="RollingFile" /> </Root> </Loggers> </Configuration> ``` 上述配置将日志写入到 `logs/app.log` 文件中,并根据时间和文件大小进行滚动[^2]。 #### 2. 使用控制台输出日志 如果只需要将日志输出到控制台,可以使用 `ConsoleAppender`。这对于调试和开发环境非常有用。 ```xml <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` #### 3. 使用数据库记录日志 log4j2 还支持将日志写入到本地数据库中,通过 `JDBCAppender` 实现。这种方式适用于需要对日志进行进一步分析的场景。 ```xml <Configuration status="WARN"> <Appenders> <JDBC name="JDBCAppender" tableName="logs"> <ConnectionFactory class="com.example.DatabaseConnectionFactory" method="getDatabaseConnection"/> <Column name="log_date" isEventTimestamp="true"/> <Column name="level" pattern="%level"/> <Column name="logger" pattern="%logger"/> <Column name="message" pattern="%message"/> </JDBC> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="JDBCAppender" /> </Root> </Loggers> </Configuration> ``` ### 4. 使用本地内存缓存日志 在某些情况下,可能需要将日志先缓存到内存中,稍后写入到持久化存储中。log4j2 提供了 `MemoryAppender` 来实现这一功能。 ```xml <Configuration status="WARN"> <Appenders> <Memory name="MemoryAppender" bufferSize="1000"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Memory> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="MemoryAppender" /> </Root> </Loggers> </Configuration> ``` ### 5. 异步日志处理 log4j2 的异步日志功能可以提高日志记录的性能,尤其是在高并发场景下。通过 `AsyncAppender` 可以将日志记录操作异步化。 ```xml <Configuration status="WARN"> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="10 MB" /> </Policies> </RollingFile> <Async name="AsyncAppender"> <AppenderRef ref="RollingFile"/> </Async> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="AsyncAppender" /> </Root> </Loggers> </Configuration> ``` ### 6. 日志级别过滤 通过配置 `LevelRangeFilter`,可以实现对不同级别的日志进行过滤,确保只有特定级别的日志被记录。 ```xml <Configuration status="WARN"> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log"> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="10 MB" /> </Policies> <Filters> <LevelRangeFilter minLevel="debug" maxLevel="debug" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="RollingFile" /> </Root> </Loggers> </Configuration> ``` ### 总结 在 log4j2 无法进行网络请求的情况下,可以通过配置本地日志处理机制来确保日志的正常记录和输出。常见的本地日志处理方式包括文件输出、控制台输出、数据库记录、内存缓存、异步日志处理以及日志级别过滤。这些配置可以根据具体需求进行组合和调整,以满足不同的日志记录需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值