特殊的 log4j:ERROR Failed to rename 問題

由於業務功能的需要,我們需要分流日誌語句到不同的文件裏,我們的 log4j.properties 配置如下:

### set log levels ###
log4j.rootLogger = INFO,CONSOLE,D
log4j.logger.firstLogger = INFO,firstAdpter
log4j.logger.secondLogger = INFO,secondAdpter

###  output to the console ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
...

### Output to the log file ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D:/mylog/logError.log
...


### Output to the first log file ###
log4j.appender.firstAdpter = org.apache.log4j.DailyRollingFileAppender
log4j.appender.firstAdpter.File = D:/mylog/logError.log 
...


### Output to the multi-centres log file ###
## reference : https://blog.csdn.net/tterminator/article/details/53559936
log4j.appender.secondAdpter = org.apache.log4j.DailyRollingFileAppender
log4j.appender.secondAdpter.File = D:/mylog/log-mutli-centres.log
...

由於rootLogger 和一個logger 輸出的文件一樣,導致日誌文件名無法重命名,也就是類似 log4j:ERROR Failed to rename [D:/mylog/logError.log] to [D:/mylog/logError.log.2019-08-07] 錯誤。但是,我把文件名修改爲各不相同就沒有這個問題了:

### set log levels ###
log4j.rootLogger = INFO,CONSOLE,D
log4j.logger.firstLogger = INFO,firstAdpter
log4j.logger.secondLogger = INFO,secondAdpter

###  output to the console ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
...

### Output to the log file ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D:/mylog/logError.log
...


### Output to the first log file ###
log4j.appender.firstAdpter = org.apache.log4j.DailyRollingFileAppender
log4j.appender.firstAdpter.File = D:/mylog/logError-mutli-host.log 
...


### Output to the multi-centres log file ###
## reference : https://blog.csdn.net/tterminator/article/details/53559936
log4j.appender.secondAdpter = org.apache.log4j.DailyRollingFileAppender
log4j.appender.secondAdpter.File = D:/mylog/log-mutli-centres.log
...

根據網友的說法,是 tomcat 的server.xml 裏面的 Host 設置錯誤,我查看了我的server.xml,確實有 <Context docBase="xxxx" path="/" reloadable="true"/> 這個設置,但卻並不會導致 rename failed 的問題。(我是在 Eclipse 啓動 tomcat 的,eclipse 會使用元數據修改拷貝過來的 tomcat 的 server.xml)

查看了源碼,log4j.properties 裏面的 appender 都會被反射生成實例,爲啥兩個 appender 實例使用同一個文件,在重命名的時候會報錯呢,實在不知道從哪思考問題的根源。哪位網友有思路,請不吝賜教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章