我使用的Log4j作为一个项目,我的工作日志框架。 我有以下情况:Log4j的配置将日志写入日志文件。 在某些时候,这个日志文件被复制到另一个目的地和删除。 日志框架一直工作,而是因为它被删除日志不会写入日志文件。 有没有办法告诉Log4j的重新创建该文件,并保留日志写入日志文件。
最好的问候,拉希德
我使用的Log4j作为一个项目,我的工作日志框架。 我有以下情况:Log4j的配置将日志写入日志文件。 在某些时候,这个日志文件被复制到另一个目的地和删除。 日志框架一直工作,而是因为它被删除日志不会写入日志文件。 有没有办法告诉Log4j的重新创建该文件,并保留日志写入日志文件。
最好的问候,拉希德
我研究的log4j的来源和发现的log4j不能创建新的日志文件,它只是打印错误消息System.err的当日志文件被删除
/**
This method determines if there is a sense in attempting to append.
<p>It checks whether there is a set output target and also if
there is a set layout. If these checks fail, then the boolean
value <code>false</code> is returned. */
protected boolean checkEntryConditions() {
if(this.closed) {
LogLog.warn("Not allowed to write to a closed appender.");
return false;
}
if(this.qw == null) {
errorHandler.error("No output stream or file set for the appender named ["+
name+"].");
return false;
}
if(this.layout == null) {
errorHandler.error("No layout set for the appender named ["+ name+"].");
return false;
}
return true;
}
我觉得有两个解决方法
确保你可以在你的log4j文件中声明该行
log4j.appender.rollingFile.File=D:/myapp/mylog.log
如果你已经宣布它,您日志文件可以删除或替换,只要你喜欢。 然后重新运行您的程序和新的日志文件,在这个路径中创建。
试试这个类
package wodong.test;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;
public class LastFileAppender extends FileAppender {
@Override
public void append(LoggingEvent event) {
checkLogFileExist();
super.append(event);
}
private void checkLogFileExist(){
File logFile = new File(super.fileName);
if (!logFile.exists()) {
try {
logFile.createNewFile();
} catch (IOException e) {
System.out.println("Error while create new log file.");
}
}
}
}
还可以编辑log4j的配置文件
log4j.appender.R=wodong.test.LastFileAppender
我经历的源代码去log4j
。 当一个FileAppender / RollingFileAppender进行初始化,一个FileOutputStream
被创建的实例指向文件。 一个新FileDescriptor
对象被创建来表示此文件连接。 这是什么原因,其他的解决方案,如通过监测的Cron的文件,并通过重写,我没有工作,在创建append方法的文件,因为一个新的文件描述符被分配到新的文件。 Log4j的作家仍然指向旧的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
试试这个。 我没有一台Linux机器,现在,所以我不知道这是否可以解决性能问题。
package wodong.test;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;
public class LastFileAppender extends FileAppender {
@Override
public void append(LoggingEvent event) {
checkLogFileExist();
super.append(event);
}
private void checkLogFileExist() {
if (qw == null) {
File logFile = new File(super.fileName);
if (!logFile.exists()) {
try {
logFile.createNewFile();
} catch (IOException e) {
System.out.println("Error while create new log file.");
}
}
}
}
}