1. 负责集成子模块配置文件的配置
log4j2支持其配置文件的模块化。也就是不是提供一个集中的大配置文件,而是将其按模块拆分,每个模块一个独立的配置文件。在负责进行部署的集成项目中,提供一个配置文件,指定从那些路径加载配置文件即可。
log4j2对模块化进行支持的基础,是一个新增的属性 log4j.configurationFile。该属性定义在系统的环境变量中,也可以定义在一个独立的配置文件 log4j2.component.properties 中。其格式大体如下:
log4j.configurationFile=xx/config/log4j2/log4j2-properties.xml,xx/config/log4j2/log4j2.xml,xx/config/log4j2/log4j2-message.xml
其具体的用户就不再详述了,可以自己看log4j2的官方文档关于自动配置的章节。
2. 增加一个独立配置文件,用于放置可能根据环境变化的属性,并在业务子模块的配置文件中引用
定义一个独立的配置文件,叫做 log4j2-properties.xml (个人喜好,可以自己决定如何取名,只要在log4j.component.properties中引入该文件即可)。这个文件,需要放置在集成项目中,而不是业务子模块中。
其内容,大体如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<properties>
<Property name="LogRoot">/data/applogs/aiwaiqin</Property>
...
</properties>
</Configuration>
在具体子模块的配置文件中,就可以引用这个文件中定义的属性。比如,我要在业务子模块的配置文件 log4j2-message.xml 中,引用 DefaultLogLevel 和 ConsoleLogLevel,我就需要先定义这两个属性:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<properties>
<Property name="LogRoot">/data/applogs/aiwaiqin</Property>
<Property name="DefaultLogLevel">error</Property>
<Property name="ConsoleLogLevel">error</Property>
</properties>
</Configuration>
然后,在对应的业务子模块的配置文件中引用它:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="${DefaultLogLevel}">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingFile
name="cn.mr.venus.console.log.file"
fileName="${LogRoot}/console/console.log"
filePattern="${LogRoot}/console/console.%d{yyyy-MM-dd}.log"
immediateFlush="true"
append="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="50 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="${ConsoleLogLevel}">
<AppenderRef ref="Console" />
<AppenderRef ref="cn.mr.venus.console.log.file" />
</Root>
</Loggers>
</Configuration>
3. 在集成项目中,使用maven为不同环境提供对应版本的 log4j2-properties.xml 配置文件
因为业务子模块中的配置不适合根据环境进行配置。但集成项目却可以根据环境提供不同的profile,因此在部署项目的pom.xml中,只要在不同的profile中,提供对应版本的 log4j2-properties.xml 文件。根据各自的具体环境,将对应版本的该文件,拷贝到 xx/log4j2/目录下。其中,“xx/log4j2”为部署项目中定义的放置所有模块的log4j2-sub-mod.xml配置文件的地方 :
...
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}/xx/config/properties</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src/main/profiles/config/dev</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-log4j2-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}/xx/config/log4j2</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src/main/profiles/log4j2/dev</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
...
这一段配置并不完整,关于profile的具体使用,不在本文章的记录范围内,需自行百度maven。
4. 补充部分log4j2的配置细节
4.1. 配置日志启动时,或每天,或达到50m时,都拆分文件
log4j2通过Appender的Policies来配置输出文件的拆分策略:
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="50 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
- OnStartupTriggeringPolicy:启动时拆分新文件。
- SizeBasedTriggeringPolicy:达到指定大小时拆分新文件,属性 size 用于指定文件大小的阀值。
- TimeBasedTriggeringPolicy:和 RollingFile 的 filePattern 属性一起工作,决定按什么时间单位拆分新文件。如果filePattern指定的最小时间单位是天,就按天拆分;如果filePattern指定的最小时间单位是小时,就按小时拆分。filePattern的具体配置格式,参看log4j2的官方文档,就不在这里细说了。
网友评论