特殊的 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 实例使用同一个文件,在重命名的时候会报错呢,实在不知道从哪思考问题的根源。哪位网友有思路,请不吝赐教。

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