springboot プロジェクトは log4j2 を jar パッケージに統合し、外部の log4j2 ファイルをインポートしますが、実行ログは印刷できません

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>





おすすめ

転載: blog.csdn.net/sunrj_niu/article/details/128033321