需要备份日志文件,并在最后一个日志文件被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并覆盖受保护的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() {
//...
}
}

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

相关内容

  • 没有找到相关文章

最新更新