O projeto springboot integra log4j2 em um pacote jar, importa o arquivo log4j2 externo e o log em execução não pode ser impresso
Descrição do Problema
Como já existem arquivos log4j2 no projeto, eles também são incluídos no jar digitado. O arquivo log4j2 externo é introduzido em application.yml. Quando o projeto inicia, o log pode ser impresso, mas quando o arquivo de log atinge o valor especificado ou a data após a reversão, o projeto não será logado
Análise de causa
log4j2 é uma programação de plug-in. Quando o pacote log4j2 é compilado, ou o pacote contendo o plug-in log4j2 é compilado, as informações do plug-in a serem carregadas serão colocadas em META-INF/org/apache/logging/log4j /core/config/plugins/ Arquivo Log4j2Plugins.dat (incluindo o plug-in nativo logj42 oficial) e, quando o projeto for iniciado, o log4j2 verificará o arquivo de informações do plug-in no diretório META-INF de cada pacote jar e em seguida, carregue o plug-in. Mas quando o projeto é empacotado em um pacote jar, se houver um arquivo Log4j2Plugins.dat em dois pacotes jar diferentes, haverá um problema, um dos arquivos será sobrescrito pelo outro, resultando em um arquivo quando o projeto iniciar O plug-in não pode ser carregado normalmente, resultando em um erro.
problema resolvido
Exclua o arquivo log4j2 no projeto para garantir que não haja nenhum arquivo log4j2 no jar
Anexe a configuração do 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>