springboot项目集成log4j2打成jar包 ,引入外边的log4j2文件,运行日志无法打印
问题描述
因为项目中已经有log4j2文件,所以打的jar中也有,在application.yml中引入的是外部的log4j2文件,当项目启动时,可以打印日志,但是当log文件因为文件达到规定的值或者因为日期进行回滚后,项目就不打日志了
原因分析
log4j2 是采用的插件式编程,当log4j2包编译时,或者含有log4j2插件的包编译时,会将需要加载的插件信息放在META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat这个文件中(包括官方logj42的原生插件),然后项目启动的时候,log4j2会在各个jar包的META-INF目录下扫描这个插件信息文件,然后去加载插件。但是当项目被打成一个jar包时,如果两个不同的jar包中都有Log4j2Plugins.dat 这个文件,就会出现问题,其中一个文件会被另一个覆盖,导致项目启动的时候有一个文件中的插件不能被正常加载,导致报错。
问题解决
删除项目中的log4j2文件 即保证打的jar中么有log4j2文件
附上log4j2的配置
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" monitorInterval="60">
<properties>
<property name="LOG_HOME">/var/log/koal</property>
<property name="LOG_FILE">ipsec-rms</property>
<property name="FILE_NAME">ipsec-rms</property>
</properties>
<Appenders>
<!--Console:日志输出到控制台标准输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="RollingFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/${LOG_FILE}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
<!--
onMatch="ACCEPT" 表示匹配该级别及以上
onMismatch="DENY" 表示不匹配该级别以下的
-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--
格式化输出:
%d 输出时间
%L 输出行号
%m或%msg或%message 输出日志信息
%t或%tn或%thread或%threadName 输出线程id
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
<Policies>
<!--
TimeBasedTriggeringPolicy基于时间的触发策略:
该策略主要是完成周期性的log文件封存工作。有两个参数:interval,integer型,指定两次封存动作之间的时间间隔。这个配置需要和filePattern结合使用,filePattern日期格式精确到哪一位,interval也精确到哪一个单位。
注意filePattern中配置的文件重命名规则是%d{
yyyy-MM-ddHH-mm-ss}-%i,最小的时间粒度是ss,即秒钟。TimeBasedTriggeringPolicy默认的size是1,结合起来就是每1秒钟生成一个新文件。如果改成%d{
yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件-->
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<!-- 最多同一文件夹下5个文件开始覆盖-->
<DefaultRolloverStrategy max="5">
<!--
Delete 删除策略
maxDepth要访问的目录的最大级别数。值为0表示仅访问起始文件,除非安全管理器拒绝。Integer.MAX_VALUE的值指示应访问所有级别。
默认值为1,表示仅指定基本路径中的文件。-->
<Delete basePath="${LOG_HOME}/${LOG_FILE}/$${date:yyyy-MM}/" maxDepth="2">
<IfFileName glob="*.log" />
<!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用
另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
<!--30天-->
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<Syslog name="SYSLOG" host="127.0.0.1" port="514" protocol="UDP"/>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="SYSLOG"/>
</Root>
</Loggers>
</Configuration>