springboot プロジェクトは log4j2 を jar パッケージに統合し、外部の log4j2 ファイルをインポートしますが、実行ログは印刷できません
問題の説明
プロジェクトには既に log4j2 ファイルがあるため、それらも型指定された jar に含まれます。外部の log4j2 ファイルは application.yml に導入されます。プロジェクトの開始時にログを出力できますが、ログ ファイルが指定された値に達すると、または日付 ロールバック後、プロジェクトはログに記録されません
原因分析
log4j2 はプラグイン プログラミングです。log4j2 パッケージをコンパイルするか、log4j2 プラグインを含むパッケージをコンパイルすると、ロードされるプラグイン情報は META-INF/org/apache/logging/log4j に配置されます。 /core/config/plugins/ Log4j2Plugins.dat ファイル (公式の logj42 ネイティブ プラグインを含む)、プロジェクトの開始時に、log4j2 は各 jar パッケージの META-INF ディレクトリにあるプラグイン情報ファイルをスキャンします。次にプラグインをロードします。ただし、プロジェクトが jar パッケージにパッケージ化されている場合、2 つの異なる 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>