[英]After JDK11 upgrade, log4j2 RollingFileAppender throws java.io.FilePermission error
從 JDK8 升級到 JDK11 后,我們在啟動 tomcat 時收到以下消息:
ERROR Could not create plugin of type class
org.apache.logging.log4j.core.appender.RollingFileAppender
for element RollingFile: java.security.AccessControlException:
access denied ("java.io.FilePermission" "/zdata/svrgrp/logs/qam1" "read")
java.security.AccessControlException: access denied ("java.io.FilePermission"
"/zdata/svrgrp/logs/qam1" "read")
Java 將其他文件寫入該目錄沒有問題; 例如,我們在命令行中有一個 -outfile /zdata/tomcat/qam1/logs/catalina.out,我們看到 output 被寫在那里。
但最令人費解的是,當我們使用完全相同的 catalina 策略在 JDK8 上運行它時,它運行得很好。
JDK11 使用 log4j 的方式是否有一些根本性的變化可以解釋這種行為?
我們的 log4j 配置 xml 如下。 sys:applogdir 定義為 /zdata/svrgrp/logs/qam1:
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration>
<Appenders>
<RollingFile
name="default.file"
fileName="${sys:applogdir}/myapp.log"
filePattern="${sys:applogdir}/myapp.log.%d{yyyy-MM-dd}">
<PatternLayout>
<Pattern>%d %-5p [%t]:${sys:bi.tomcat.instanceName} (%F:%L) - %m%n</Pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy/>
</RollingFile>
<Loggers>
<Root level="debug">
<AppenderRef ref="default.file"/>
</Root>
</Loggers>
</Configuration>
有沒有其他人經歷過從 JDK8 升級到 JDK11 的這種行為? 對可能發生的變化有任何想法嗎?
更新
從 JDK9 開始,java.io.FilePermission 默認停止規范化路徑名。 這意味着將不再遵循符號鏈接。
在我們的環境中,“/zdata/svrgrp/logs/qam1”是指向另一個文件系統上某個位置的符號鏈接。 因此 java.io.FilePermission 不會遵循該符號鏈接,從而導致出現“拒絕訪問”錯誤。
您可以通過將 permissionsUseCanonicalPath 屬性設置為 True 來告訴 java.io 恢復到其舊行為。 所以我將它添加到我們的啟動腳本中:
-Djdk.io.permissionsUseCanonicalPath=true
一切都開始起作用了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.