Log4j2日志配置打印
LogManager.getLogger是Log4j2提供的一个用于获取Logger对象的方法。它接受一个字符串参数,用于指定Logger的名称或者Logger的类。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyClass {
private static final Logger logger = LogManager.getLogger(MyClass.class);
public void myMethod() {
logger.info("This is a log message");
}
}
在上面的示例中,我们使用LogManager.getLogger方法创建了一个Logger对象,并将其赋值给一个静态的logger变量。MyClass类中的myMethod方法使用这个Logger对象打印了一个info级别的日志消息。
为了使用Log4j2,你还需要在项目中添加相关的依赖项。可以在Maven配置文件(pom.xml)中添加以下依赖项:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.x.x</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.x.x</version>
</dependency>
请将2.x.x替换为所需的Log4j2版本号。
案例
下面是一个完整的Log4j2的配置文件示例,将Web层的日志输出到文件中:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<File name="FileAppender" fileName="logs/mylog.log" append="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</Root>
<Logger name="com.example.web" level="trace" additivity="false">
<AppenderRef ref="FileAppender" />
</Logger>
</Loggers>
</Configuration>
请确保将文件名logs/mylog.log更改为您要写入日志的实际路径。
确保将com.example.web替换为您的Web层的包名。
在您的Java代码中,确保加载该配置文件。例如,在Java应用程序的启动代码中,添加以下代码:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
public class MyApp {
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(String[] args) {
// 加载Log4j2配置文件
Configurator.initialize(null, "path/to/log4j2.xml");
// 示例日志输出
logger.debug("Debug message");
logger.info("Info message");
logger.error("Error message");
}
}
确保将"path/to/log4j2.xml"更改为您的Log4j2配置文件的实际路径。
这样配置后,Web层的日志将会打印到控制台和写入到指定的日志文件中。
请记得修改配置文件和代码中的路径和包名,以适应您的具体项目配置。
语法介绍
Log4j2的XML配置文件使用一种特定的语法来定义日志记录器的配置。以下是Log4j2 XML配置文件的完整语法介绍:
Configuration
<Configuration>元素:配置文件的根元素,用于指定配置的名称和包名称。它还有一个可选的status属性,用于设置日志记录的级别。
例如:
<Configuration status="INFO" name="MyApp" packages="com.example" monitorInterval="60">
monitorInterval是Log4j2中的配置选项,用于指定监视配置文件更改的时间间隔。如果在此时间间隔内检测到配置文件的更改,Log4j2会自动重新读取并重新配置自身,以便应用新的配置。
在Log4j2的配置文件中,可以使用以下方式指定monitorInterval:
<Configuration monitorInterval="时间间隔">
<!-- 配置内容 -->
</Configuration>
其中,属性monitorInterval的含义如下:
-
时间间隔:用于指定监测配置文件更改的时间间隔,默认单位为毫秒。可以使用包含单位的时间值,如5000ms表示5秒,1m表示1分钟。
使用monitorInterval配置项可以方便地实现Log4j2配置文件的动态更新。当配置文件更改时,Log4j2会自动重新加载并应用新的配置,而无需重启应用程序。这对于在运行时调整日志记录行为非常有用。但是,过于频繁的重新加载可能会对性能产生影响,因此应谨慎选择适当的时间间隔设置。
Properties
<Properties>元素:可选元素,在其中定义一个或多个属性,可以在日志配置的其他部分中重复使用。每个属性通过<Property>元素定义,使用name属性指定属性名称,使用value属性指定属性值。例如:
<!-- 自定义一些变量 -->
<Properties>
<!-- 变量定义 -->
<Property name="logDir">logs</Property>
<!-- Appender在将日志数据写入目标位置之前,一般会将日志数据通过Layout进行格式化。PatternLayout可以使用与C语言printf函数类似
的转换模式来指定输出格式。常见的配置如下:
- %d{yyyy-MM-dd HH:mm:ss.SSS} : 日志生成时间,输出格式为“年-月-日 时:分:秒.毫秒”
- %p : 日志输出格式
- %c : logger的名称
- %m : 日志内容,即 logger.info("message")
- %n : 换行符
- %T : 线程号
- %L : 日志输出所在行数
- %M : 日志输出所在方法名 -->
<Property name="logPattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] %logger{36} - %msg%n</Property>
<Property name="LOG_LEVEL">${sys:x.root.logger}</Property>
<!-- 单个日志文件最大大小,单位可以是KB, MB or GB -->
<Property name="max_single_file_size">1MB</Property>
</Properties>
在启动脚本中指定log4j2的配置文件,指定日志级别,指定日志文件名称,指定日志目录。例如下
-Dlog4j.configurationFile=${logfile}
-Dx.root.logger=info
-Dx.log.file=x.log
-Dx.log.dir=/root/log/xlog4j2.xml中的${sys:x.root.logger},相当于System.getProperty("x.root.logger");
系统获取脚本中-D设置的key对应的值jvm 启动参数如下
-Dapp.log.home=D:/logs
———————————————
Appenders
<Appenders>元素:用于定义输出源(appender),即日志消息将被发送到的目标。每个输出源使用<Appender>元素进行定义。其中包括输出源的名称(name)和输出目标(target)。在输出源中,可以使用<PatternLayout>元素指定日志消息的格式。ThresholdFilter是Log4j2中的过滤器(Filter),用于过滤日志事件并只保留满足特定阈值条件的事件。例如:
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!-- 只接受程序中DEBUG级别的日志进行处理-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 在大多数情况下,Appender将格式化LogEvent的责任委托给Layout -->
<PatternLayout pattern="${logPattern}"/>
</Console>
<RollingFile name="File" fileName="${logDir}/myapp.log" filePattern="${logDir}/myapp-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="${logPattern}"/>
<!-- Policies and RolloverStrategy -->
</RollingFile>
</Appenders>
ThresholdFilter的配置如下:
<ThresholdFilter level="阈值级别" onMatch="匹配操作" onMismatch="不匹配操作"/>
其中,属性如下:
-
level:用于指定阈值级别。只有满足该级别的日志事件才会通过过滤器。
- 可以使用标准的Log4j2级别,如
trace、debug、info、warn、error、fatal。
- 可以使用标准的Log4j2级别,如
-
onMatch:用于指定匹配操作。当日志事件满足阈值级别时,执行的操作。可选值有:
-
ACCEPT:表示接受(保留)该日志事件,并继续传递给下一个过滤器/输出源。 -
DENY:表示拒绝(过滤)该日志事件,不会继续传递给下一个过滤器/输出源。
-
-
onMismatch:用于指定不匹配操作。当日志事件不满足阈值级别时,执行的操作。可选值有:
-
ACCEPT:表示接受(保留)该日志事件,并继续传递给下一个过滤器/输出源。 -
DENY:表示拒绝(过滤)该日志事件,不会继续传递给下一个过滤器/输出源。
-
RollingFile是Log4j2提供的一个输出源(Appender),用于将日志事件写入到滚动文件中。滚动文件是指根据一定的条件(如文件大小或时间间隔)创建新的日志文件,从而实现日志文件的分割和管理。
在Log4j2的配置文件中,可以使用RollingFile输出源来定义输出到滚动文件中的日志事件。示例如下:
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
在上述配置中,RollingFile输出源具有以下属性:
-
name:用于指定输出源的名称。 -
fileName:用于指定日志文件的初始名称和路径。 -
filePattern:用于指定滚动文件的名称模式。其中%d{yyyyMMdd}表示当前日期,%i表示滚动文件的索引。 -
PatternLayout:用于指定日志事件的输出格式。 -
Policies:用于指定触发滚动的策略。例如,SizeBasedTriggeringPolicy表示按文件大小触发滚动,当日志文件达到指定大小时将创建一个新文件。 -
DefaultRolloverStrategy:用于指定滚动策略的默认配置。例如,max属性指定了滚动文件的最大数量,当滚动文件达到该数量时,最旧的文件将被删除。
只需将RollingFile输出源添加到适当的日志记录器中,即可将日志事件写入滚动文件中。例如:
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
上述配置将将根日志记录器的日志事件输出到RollingFile输出源中。
使用RollingFile可以方便地实现日志文件的分割和管理,从而减小单个日志文件的大小并更好地组织和存档日志数据。
PatternLayout是Log4j2中用于指定日志事件输出格式的工具。通过使用不同的模式字符串,可以定义日志事件的输出格式,包括日期、线程、日志级别、日志记录器名称和日志消息等。
在PatternLayout中,可以使用预定义的转换字符来表示不同的日志事件属性。以下是一些常用的转换字符:
-
%d:日志事件的日期和时间,可以指定日期格式,例如%d{yyyy-MM-dd HH:mm:ss}。 -
%t:线程名称。 -
%p:日志级别。 -
%c:日志记录器名称。 -
%m:日志消息。 -
%n:换行符。
除了预定义的转换字符外,还可以使用组合模式来创建自定义的输出格式。例如:
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
在上述示例中,模式字符串%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n定义了日志事件的输出格式。其中%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期和时间,[%t]表示线程名称,%-5level表示日志级别(占用5个字符的宽度,并且左对齐),%logger{36}表示日志记录器名称(最多显示36个字符),%msg表示日志消息,%n表示换行符。
通过使用适当的模式字符串,可以根据需求自定义日志事件的输出格式,以满足不同的日志需求。
在Log4j2中,Policies用于指定滚动文件的触发策略。滚动文件的前提是达到了某个条件(如文件大小或时间间隔),满足触发条件后将创建一个新的日志文件。
常用的触发策略包括:
-
SizeBasedTriggeringPolicy:根据日志文件的大小触发滚动。可以通过size属性指定触发滚动的大小阈值,例如size="10MB"表示当日志文件大小达到10MB时触发滚动。 -
TimeBasedTriggeringPolicy:根据一定的时间间隔触发滚动。可以通过interval属性指定时间间隔,例如interval="1"表示每隔1单位触发滚动。单位可以是Millis(毫秒)、Seconds(秒)、Minutes(分钟)、Hours(小时)或Days(天)。 -
OnStartupTriggeringPolicy:在应用程序启动时立即触发滚动,创建一个新的日志文件。 -
CompositeTriggeringPolicy:组合多个触发策略,只要有一个策略触发了滚动,就会创建新的日志文件。
以下是一个使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy的示例:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
在上述示例中,Policies包含了SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy,分别指定了根据日志文件的大小和时间间隔触发滚动。当日志文件达到10MB或每隔1单位时,将创建一个新的日志文件。
通过使用适当的触发策略,可以根据时间或文件大小等条件来自动触发滚动,实现日志文件的管理和分割。
DefaultRolloverStrategy是Log4j2中的一个默认滚动策略,用于指定滚动文件的命名策略和最大保留文件数。
通过max属性,可以指定最多保留的滚动文件数量。例如max="10"表示最多保留10个滚动文件。
当滚动文件达到最大数量后,会根据命名策略来进行文件名的调整。DefaultRolloverStrategy使用了一个简单的命名策略,根据filePattern属性中的时间格式符和索引来生成新的滚动文件名。例如filePattern="logs/app-%d{yyyyMMdd}.%i.log",其中%d{yyyyMMdd}表示按照年月日的格式作为滚动文件名的一部分,%i表示索引,用于区分相同时间格式的不同滚动文件。
当最大保留文件数被实际文件数量超过后,较早的文件将被删除,以便实现滚动文件的管理。
以下是一个示例:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
在上述示例中,通过DefaultRolloverStrategy指定了最多保留10个滚动文件。当滚动文件数量超过10个时,较早的文件将被删除。滚动文件名根据filePattern中的时间格式和索引进行命名。
在Log4j2中,“Delete”是一种滚动策略,用于指定在滚动文件时删除一些旧文件。
要使用“Delete”滚动策略,您需要将其配置在<RollingFile>元素的<DefaultRolloverStrategy>子元素中,或者将其作为<RolloverStrategy>的子元素。
“Delete”滚动策略使用一个或多个触发条件来删除旧文件。常用的触发条件包括以下几种:
-
IfFileName:根据文件名是否匹配特定的规则来删除文件。例如,可以使用正则表达式来匹配文件名,并删除匹配的文件。 -
IfLastModified:根据文件的最后修改时间是否在特定的时间范围内来删除文件。例如,可以删除最后修改时间早于7天前的文件。 -
IfAccumulatedFileCount:根据文件的累积数量来删除文件。例如,可以指定要保留的文件数量,超过这个数量的文件将被删除。 - IfAccumulatedFileSize:在遍历文件树时文件总大小超过上限后接受路径;
- IfAll:如果所有内嵌条件都接受了某个路径才会接受该路径,相当于AND逻辑,其内嵌条件的执行顺序是任意的;
- IfAny:如果任意一个内嵌条件接受了某个目录就接受该目录,相当于OR逻辑,其内嵌条件的执行顺序是任意的
- IfAny:如果任意一个内嵌条件接受了某个目录就接受该目录,相当于OR逻辑,其内嵌条件的执行顺序是任意的
以下是一个示例,展示了如何使用“Delete”滚动策略:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="logs">
<IfFileName glob="logs/app-*-10.log"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
在上述示例中,我们设置了最大保留文件数为10,使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy触发滚动。同时,使用了“Delete”滚动策略来删除一些旧的日志文件。在<Delete>元素中,我们指定了要删除的文件的基本路径(basePath),然后使用<IfFileName>来匹配文件名模式,并删除匹配的文件。
通过使用“Delete”滚动策略,可以根据特定的条件自动删除旧的滚动文件,实现日志文件的管理和清理。
IfFileName是Log4j2中“Delete”滚动策略中的一种触发条件,用于根据文件名是否匹配特定的规则来删除文件。
具体地说,IfFileName使用一个或多个glob模式(类似于Unix的文件名模式)来匹配文件名,并删除匹配的文件。可以使用以下通配符来指定模式:
-
*:匹配任意数量的字符。 -
?:匹配单个字符。 -
[set]:匹配集合中的任意一个字符。 -
[!set]:匹配不在集合中的任意一个字符。
以下是一个示例,展示了如何在“Delete”滚动策略中使用IfFileName来删除匹配特定文件名模式的文件:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="logs">
<IfFileName glob="logs/app-*-10.log"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
在上述示例中,我们使用glob="logs/app-*-10.log"来指定要删除的文件名模式。该模式将匹配以"logs/app-"开头、以"-10.log"结尾的文件名,并删除这些文件。
通过使用IfFileName触发条件,可以根据文件名的模式来删除匹配的文件,实现更精细的日志文件管理。
IfLastModified是Log4j2中“Delete”滚动策略中的一种触发条件,用于根据文件的最后修改时间是否在特定的时间范围内来删除文件。
具体地说,IfLastModified使用最后修改时间(以毫秒为单位)和指定的时间范围进行比较,并决定是否删除文件。可以使用以下条件之一来指定时间范围:
age:指定文件的最大年龄(以毫秒为单位)。例如,age="604800000"表示删除最后修改时间早于7天前的文件。-
modtime:指定文件的最后修改时间。可以使用以下格式之一来指定时间:
-
yyyy-MM-dd HH:mm:ss(例如,modtime="2021-10-01 12:00:00") -
yyyy-MM-dd HH:mm:ss.SSS(例如,modtime="2021-10-01 12:00:00.000") -
yyyy-MM-dd(例如,modtime="2021-10-01")
-
以下是一个示例,展示了如何在“Delete”滚动策略中使用IfLastModified来删除最后修改时间在特定时间范围内的文件:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="logs">
<IfLastModified age="604800000"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
在上述示例中,我们使用age="604800000"来指定最大年龄为7天(以毫秒为单位)。这意味着将删除最后修改时间早于7天前的文件。
通过使用IfLastModified触发条件,可以根据文件的最后修改时间来删除符合特定时间范围的文件,实现更精细的日志文件管理。
IfAccumulatedFileCount不是Log4j2中的内置触发条件。这是因为在Log4j2的滚动策略中,并没有直接基于累积的文件数量来触发滚动或删除文件的内置条件。
然而,您可以使用自定义的插件或脚本来实现基于累积文件数量的滚动和删除逻辑。
要实现基于累积文件数量的滚动和删除策略,您可以考虑以下步骤:
- 创建一个自定义的
TriggeringPolicy,用于计算和跟踪已累积的文件数量。 - 在每次写入日志时,更新并计算已累积的文件数量。
- 当已累积的文件数量达到特定阈值时,触发滚动操作,生成新的日志文件。
- 在滚动操作中,可以根据需要删除旧的日志文件,以控制累积文件数量。
以下是一个示例伪代码,展示了如何使用自定义插件实现基于累积文件数量的滚动和删除策略:
public class AccumulatedFileCountTriggeringPolicy implements TriggeringPolicy {
private int maxFileCount;
private int accumulatedFileCount;
public AccumulatedFileCountTriggeringPolicy(int maxFileCount) {
this.maxFileCount = maxFileCount;
this.accumulatedFileCount = 0;
}
@Override
public boolean isTriggeringEvent(LogEvent event, Path file, long fileLength) {
updateAccumulatedFileCount();
return shouldTriggerRollover();
}
private void updateAccumulatedFileCount() {
// 更新已累积的文件数量
accumulatedFileCount++;
}
private boolean shouldTriggerRollover() {
// 检查已累积的文件数量是否达到阈值
return accumulatedFileCount >= maxFileCount;
}
}
然后,您可以在Log4j2的配置文件中使用这个自定义的插件:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
<AccumulatedFileCountTriggeringPolicy maxFileCount="10"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="logs">
<IfAccumulatedFileCount count="10"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
在上述示例中,我们创建了一个自定义的AccumulatedFileCountTriggeringPolicy,该策略在每次写入日志时更新并计算已累积的文件数量。当已累积的文件数量达到10时,使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy触发滚动操作生成新的日志文件。对于旧的日志文件的删除,可以使用IfAccumulatedFileCount触发条件和Delete策略来控制累积文件数量不超过10个。
请注意,上述示例中AccumulatedFileCountTriggeringPolicy和IfAccumulatedFileCount是伪代码,您需要根据实际需求进行适当的实现。这只是一种基于累积文件数量的实现思路,具体的实现细节可能因您的应用场景而异。
IfAccumulatedFileSize也不是Log4j2中的内置触发条件。在Log4j2的滚动策略中,也没有直接基于累积文件大小来触发滚动或删除文件的内置条件。
与上述基于累积文件数量的实现类似,您可以使用类似的自定义插件或脚本来实现基于累积文件大小的滚动和删除逻辑。
要实现基于累积文件大小的滚动和删除策略,您可以考虑以下步骤:
- 创建一个自定义的
TriggeringPolicy,用于计算和跟踪已累积的文件大小。 - 在每次写入日志时,更新并计算已累积的文件大小。
- 当已累积的文件大小达到特定阈值时,触发滚动操作,生成新的日志文件。
- 在滚动操作中,可以根据需要删除旧的日志文件,以控制累积文件大小。
以下是一个示例伪代码,展示了如何使用自定义插件实现基于累积文件大小的滚动和删除策略:
public class AccumulatedFileSizeTriggeringPolicy implements TriggeringPolicy {
private long maxFileSize;
private long accumulatedFileSize;
public AccumulatedFileSizeTriggeringPolicy(long maxFileSize) {
this.maxFileSize = maxFileSize;
this.accumulatedFileSize = 0;
}
@Override
public boolean isTriggeringEvent(LogEvent event, Path file, long fileLength) {
updateAccumulatedFileSize(fileLength);
return shouldTriggerRollover();
}
private void updateAccumulatedFileSize(long fileLength) {
// 更新已累积的文件大小
accumulatedFileSize += fileLength;
}
private boolean shouldTriggerRollover() {
// 检查已累积的文件大小是否达到阈值
return accumulatedFileSize >= maxFileSize;
}
}
然后,您可以在Log4j2的配置文件中使用这个自定义的插件:
<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyyMMdd}.%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
<TimeBasedTriggeringPolicy interval="1"/>
<AccumulatedFileSizeTriggeringPolicy maxFileSize="100MB"/>
</Policies>
<DefaultRolloverStrategy max="10">
<Delete basePath="logs">
<IfAccumulatedFileSize size="100MB"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
在上述示例中,我们创建了一个自定义的AccumulatedFileSizeTriggeringPolicy,该策略在每次写入日志时更新并计算已累积的文件大小。当已累积的文件大小达到100MB时,使用SizeBasedTriggeringPolicy和TimeBasedTriggeringPolicy触发滚动操作生成新的日志文件。对于旧的日志文件的删除,可以使用IfAccumulatedFileSize触发条件和Delete策略来控制累积文件大小不超过100MB。
请注意,上述示例中AccumulatedFileSizeTriggeringPolicy和IfAccumulatedFileSize是伪代码,您需要根据实际需求进行适当的实现。这只是一种基于累积文件大小的实现思路,具体的实现细节可能因您的应用场景而异。
Loggers
<Loggers>元素:用于定义日志记录器(logger),即日志消息被发送到的特定目录。有两种类型的日志记录器:<Root>日志记录器和普通日志记录器(通过其名称进行识别)。每个日志记录器使用<Logger>元素进行定义。在日志记录器中,可以通过level属性指定日志的级别,并使用<AppenderRef>元素指定日志消息的输出源。例如:
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
<AppenderRef ref="DruidSqlRollingFile"/>
</Root>
<Logger name="com.example.MyClass" level="debug">
<AppenderRef ref="File"/>
</Logger>
<!--记录druid-sql的记录-->
<Logger name="druid.sql.Statement" level="debug" additivity="false">
<appender-ref ref="DruidSqlRollingFile"/>
</Logger>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<Logger name="org.springframework" level="INFO"/>
</Loggers>
以上是Log4j2 XML配置文件的完整语法介绍。通过使用这些元素和属性,可以对日志记录器的行为进行详细的配置和定制。