在Camel框架下配置log4j2的总结
POM引用
-
需要排除的引用
由于springboot框架默认log框架为logback,所以首先我们要排除所有相关的logback引用。
如何在自己的项目中找到所有logback的引用?
在idea中,可以生成pom的依赖关系图(maven project —> 项目模块 右键 —> 选择 show denpendencies)
在生成的关系图中搜索 logging ,然后找到所有引用了logging的依赖,排除logging在我的项目中,排除依赖如下示例:
<!-- activemq --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> <exclusion> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> </exclusion> </exclusions> </dependency> <!-- Camel --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
我们的目的是在依赖图中搜不到logging的引用
-
需要添加的依赖
直接在pom中引入以下包:<!--logging--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> </dependency>
配置文件
-
配置文件命名
直接在resources目录下新建文件 log4j2.xml 文件名不可更改
框架会直接读取文件夹下以 log4j2 命名的配置文件,后缀可以是 properties, json, jsn -
配置文件内容解析
- 根节点 configuration: 属性status设置了日志框架本身日志的输出级别,属性monitorInterval设置了多长时间刷新一次日志配置,即热加载
- 二级节点 properties:此处定义了可用的全局变量,可以在后来的配置中使用属性name引用,格式为 ${name}
- 二级节点 appenders:此节点定义了你想要的任何日志输出方式的组合,我称它为过滤器,请注意在此节点下面配置的所有过滤器都不会直接输出日志,需要引用激活后才会输出日志。
>>> 三级节点: Console: 此节点可以配置控制台的日志输出
>>> 三级节点: RollingFile: 此节点可以定义文本文件的日志输出 - 二级节点 logger: 只有在此节点中引用激活的 appender 才会输出日志
-
对 RollingFile 节点的详细解释
- RollingFile的属性name定义了过滤器的id,在logger中使用此id引用激活
- 属性fileName定义了新生成日志文件的文件名格式与路径
- 属性filePattern定义了备份日志文件的路径与命名格式。注意其中的 %d{yyyyMMdd} 时间格式。此格式的最小单位关系到多久备份更换一次日志文件
- 子节点 Filters 定义了日志过滤规则
- 子节点 PatternLayout 定义了日志输出格式
- 子节点 Policies 定义了备份日志文件的方式。
- 子节点 TimeBasedTriggeringPolicy 表示以时间维度备份旧的日志更换新的文件。
属性 interval 决定了以几个最小时间单位更换日志文件。此处的最小时间单位指上文中属性filePattern的最小时间单位。例如 %d{yyyyMMdd} 且 interval=“1” 意味着一天更换一次日志文件 - 子节点 SizeBasedTriggeringPolicy表示以大小决定
- 子节点 DefaultRolloverStrategy 定义了删除log的方式
- basePath属性 定义了扫描路径
- maxDepth属性 定义了扫描深度
- glob属性 定义了匹配文件名的正则表达式
- age属性 定义了保存几个最小时间单位之内的日志文件
-
一个具体的配置文件如下所示
<?xml version="1.0" encoding="UTF-8"?> <configuration status="info" monitorInterval="30"> <properties> <property name="LOG_HOME">/app/kettle/eip/camel-logs/camel-eip-test</property> <property name="FILE_NAME">camel-eip-test</property> </properties> <appenders> <console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="[%30.30t] %-30.30c{1} %-5p %m%n"/> </console> <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info/${FILE_NAME}_info.log" filePattern="${LOG_HOME}/info/${FILE_NAME}_%d{yyyyMMdd}_info.log"> <Filters> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}/info/" maxDepth="1"> <IfFileName glob="*.log" /> <IfLastModified age="3d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${LOG_HOME}/warn/${FILE_NAME}_warn.log" filePattern="${LOG_HOME}/warn/${FILE_NAME}_%d{yyyyMMdd}_warn.log"> <Filters> <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}/warn/" maxDepth="1"> <IfFileName glob="*.log" /> <IfLastModified age="3d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileError" fileName="${LOG_HOME}/error/${FILE_NAME}_error.log" filePattern="${LOG_HOME}/error/${FILE_NAME}_%d{yyyyMMdd}_error.log"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}/error/" maxDepth="1"> <IfFileName glob="*.log" /> <IfLastModified age="3d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> </appenders> <loggers> <logger name="org.springframework" level="info"> </logger> <root level="all"> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> </root> </loggers> </configuration>