cari

Rumah  >  Soal Jawab  >  teks badan

java - 自动化采集日志出现问题,log4j无法滚动生成日志

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

黄舟黄舟2802 hari yang lalu799

membalas semua(0)saya akan balas

Tiada jawapan
  • Batalbalas