でspring-boot
war
アプリケーションを実行していて、ロギングにtomcat8
使用log4j2
しています。問題:
log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<RollingRandomAccessFile name="APP" fileName="logs/my-application.log"
filePattern="logs/archive/my-application-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d %p %c{1.}: %m%n" charset="UTF-8" />
<Policies>
<TimeBasedTriggeringPolicy modulate="true"/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef ref="APP" />
</Root>
</Loggers>
</Configuration>
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
</dependency>
結果: ログは にあり/var/log/tomcat8/my-application.log
ます。のアーカイブ/var/log/tomcat8/my-application.log.gz
これは本当に奇妙です。正しいロガー ファイル名が取得されます。しかし、今はフォルダです。
質問: なぜ私の/logs
フォルダが考慮されないのですか? 圧縮されたアーカイブ名にタイムスタンプが含まれていないのはなぜですか?
サイドノート:jar
私のアイデアでアプリを実行すると、完全に機能します。/logs
クラスパス ルートの下にフォルダーを自動的に作成します。そして、すべてのファイルは/archive
、タイムスタンプ付きで午前 0 時に適切に移動されます。
しかし、なぜこれが tomcat のように機能しないのですか?
原因が見つかりました:
fileName
が なしで始まる場合/
、それはcatalina.base=/var/lib/tomcat8
シンボリックリンクであるそのフォルダーの内部に関連していると見なされます/logs
。したがって、afileName="logs/myapp"
はそのシンボリックリンクに従います。を指している/var/log/tomcat8
.
その結果、すべてのファイルがそのフォルダーに書き込まれます。さらに、一部の tomcat のデフォルトlogrotate
は、そのフォルダー内のすべてのファイルを取得して自動的に圧縮するようです。したがって、log4j は logrotate を適用する機会がありません。
解決策: ファイル名のサブパスを設定して追加するだけです。私は使用しました:
fileName="logs/logs/my-application.log"
filePattern="logs/logs/my-app..."
これにより、ログファイルが次の場所に移動します。
/var/log/tomcat8/logs
/var/log/tomcat8/logs/archive
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加