需要备份日志文件并在最后一个日志文件被 FileHandler

问题描述

我的日志文件创建代码如下:

public static final int FILE_SIZE = 512 * 1024;

public static void setup() throws SecurityException,IOException {
    Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
    logger.setLevel(Level.INFO);
    try {
        FileHandler handler = new FileHandler("/data/mcmlog",FILE_SIZE,10,true);
        handler.setFormatter(new LogFormatter());
        logger.addHandler(handler);
        logger.setUseParentHandlers(false);
    } catch (IOException e) {
        logger.warning("Failed to initialize logger handler.");
    }
}

它以循环方式创建从 mcmlog.0 到 mcmlog.9 的日志文件。当 mcmlog.9 即将被 mcmlog.8 覆盖时,我必须压缩这些日志文件。如何查找 mcmlog.9 何时将被覆盖。

解决方法

如何查找 mcmlog.9 何时将被覆盖。

当前监听 FileHandler 旋转的唯一方法是扩展 FileHandler 并覆盖 protected void setOutputStream(OutputStream) 方法。 FileHandler 级别在轮换期间设置为 OFF。

这是一个示例类:

    public class ZipFileHandler extends FileHandler {
        private long rotated;
        private final long count;

        public ZipFileHandler(String p,long size,long count,boolean append) throws IOException {
            super(p,size,count,append);
            this.count = count;
        }

        @Override
        protected synchronized void setOutputStream(OutputStream out) throws SecurityException {
            try {
                if (Level.OFF.equals(super.getLevel())) { //Rotating...
                    if (rotated++ != 0 && rotated % count == 0) {
                        zipFiles();
                    }
                }
            } finally {
                super.setOutputStream(out);
            }
        }

        private void zipFiles() {
            //...
        }
    }

您可能会遇到使用该解决方案锁定文件的问题。在这种情况下,您应该构建一个 proxy handler 来处理打开和关闭 FileHandler。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...