1,程序a会滚动生成日志文件,日志配置的方式是 限定每一个日志文件的大小是2MB,使用到的日志API是
org.apache.log4j.RollingFileAppender 也就是说可以滚动生成日志,每一个日志文件的大小在2MB左右
配置文件的内容如下:
log4j.rootLogger=info,A2
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File= D:/temfile/test.log
log4j.appender.A2.MaxFileSize=2MB
log4j.appender.A2.maxBackupIndex=10
#log4j.appender.A2.MaxBackupIndex=100
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%p] %-d{yyyy-MM-dd HH:mm:ss} [%c %M] %m%n
程序a启动之后生成的日志文件如下:
从这里可以看出,日志文件确实滚动生成了,每一个文件的大小大约在2MB左右。
程序a生成日志的代码是通过while(true) 停隔一段时间不断logInfo,,从而可以模拟日志的生成。
2, 程序B启动之后会 每隔20秒中, 到指定的日志文件的存放目录 d:tmpfile 到该目录下寻找所有的 符合 test.log.数字 这种格式命命名的文件,然后 过滤出来
File[] listFiles = file.listFiles(new FileFilter())
将过滤得到的文件(这些文件的文件名中都带有数字)移动到另一个文件夹 d:backupUpload 下并且更改名称为
原文件名称+系统当前时间, 移动之后将 d:backupUpload 下的所有文件上传到某一个服务器。
程序B的逻辑代码如下:
//定时执行任务
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
File file = new File("D:\\temfile"); // 注意这个地方,代码2
File[] listFiles = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
System.out.println(pathname);
if (pathname.getName().startsWith("test.log.")) {
return true;
}
return false;
}
});
List<File> listFile = new ArrayList();
for (File fileItem : listFiles) {
if (fileItem.canWrite()) {
// 如果文件可写,那么表示文件当前没有正在被log4j日志系统操作
File newFile = new File(
"D:\\backupUpload \\" + fileItem.getName() + System.currentTimeMillis());
fileItem.renameTo(newFile);
listFile.add(newFile);
}
}
try {
//上传到另一个服务器
} catch (IOException ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 01, 20000, TimeUnit.MILLISECONDS);
3,运行的效果是:
首先启动程序A,然后会接连 间隔一小会 生成10个文件,然后如果再生成日志文件就会自动丢弃之前的日志文件
然后启动程序B,程序B在一启动的时候会迅速将 指定的日志目录D:\temfile下符合条件的文件移动到另一个目录"D:\backupUpload ,并上传文件。
此时因为文件被移动了,所以原日志目录下就只剩下了 test.log文件
4问题: 就如上面图片中提到的问题,为什么 test.log日志文件的大小会有10MB多,我不是已经配置过日志文件的大小上限了吗? 从上面的图片我们看到此时log日志文件并没有滚动生成。
请问谁可以帮忙解释一下吗?thanks