我有一个在Tomcat中使用log4j进行日志记录的Web应用程序。
如果我在Web应用程序运行时删除日志文件,文件不会重新创建?
如何配置log4j在删除后重新创建文件而无需重新启动Tomcat?
chmod 755
”。if [ ! -f /tomcat_dir/log4j.log ]
then
`touch /tomcat_dir/log4j.log`;
fi
x
) 权限。 - Jim#------------------------------------------------------------------------------
#
# Rolling File Appender
#
#------------------------------------------------------------------------------
log4j.appender.rfile = org.apache.log4j.RollingFileAppender
log4j.appender.rfile.File = logs/server.log
log4j.appender.rfile.Append = false
log4j.appender.rfile.MaxFileSize=10240KB
log4j.appender.rfile.MaxBackupIndex=10
log4j.appender.rfile.layout = org.apache.log4j.PatternLayout
log4j.appender.rfile.layout.ConversionPattern = %d %-5p [%C] (%t) %m (%F:%L)%n
配置一个每日的cron job(在/etc/crond.daily/中的sh脚本),清理超过$DAYS天的日志
find $LOG_ROOT/log/server.log* -mtime +$DAYS -exec rm {} \;
我找到了关于Log4j2的解决方案。
简述:
当检测到文件删除时,我们可以手动初始化滚动过程。
可以使用RollingFileManager
来初始化滚动。
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// You should know only appender name.
RollingFileAppender appender = (RollingFileAppender) ctx.getConfiguration().getAppenders().get(appenderName);
if (appender != null) {
// Manually start rollover logic.
appender.getManager().rollover();
}
更长的内容在这里。
我仔细研究了log4j
的源代码。当初始化FileAppender/RollingFileAppender时,会创建一个指向文件的FileOutputStream
实例。创建一个新的FileDescriptor
对象来表示此文件连接。这就是为什么其他解决方案,如通过Cron监视文件和通过覆盖append方法创建文件,对我没有用处的原因,因为新文件被分配给新文件描述符。Log4j Writer仍然指向旧的FileDescriptor。
解决方案是检查文件是否存在,如果不存在,则调用FileAppender类中的activeOptions方法。
package org.apache.log4j;
import java.io.File;
import org.apache.log4j.spi.LoggingEvent;
public class ModifiedRollingFileAppender extends RollingFileAppender {
@Override
public void append(LoggingEvent event) {
checkLogFileExist();
super.append(event);
}
private void checkLogFileExist(){
File logFile = new File(super.fileName);
if (!logFile.exists()) {
this.activateOptions();
}
}
}
最后将此添加到log4j.properties文件中:
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ModifiedRollingFileAppender
log4j.appender.A1.File=/path/to/file
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss,SSS} %p %c{1}: %m%n
//Skip the below lines for FileAppender
log4j.appender.A1.MaxFileSize=10MB
log4j.appender.A1.MaxBackupIndex=2
注意:我已经测试过这个log4j 1.2.17版本。
RollingFileAppender
并检查文件是否存在。
此代码在每次记录日志之前都会检查文件是否存在,并在缺失时创建该文件。public class CustomRollingFileAppender extends RollingFileAppender {
// ... Constructor
@Override
public void append(LoggingEvent event) {
if (!new File(this.fileName).exists()) {
try {
setFile(this.fileName, fileAppend, bufferedIO, bufferSize);
} catch (IOException e) {
e.printStackTrace();
}
}
super.append(event);
}
}
cat /dev/null > /path/to/log/file
(或者如果该文件不可写,则为echo "cat /dev/null > /path/to/log/file" | sudo -s
)。 - Lambart