问题描述
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。