java.util.logging.Filehandler 更改输出文件时调用方法

Call method when java.util.logging.Filehandler changes output file

在我的 java-server 中,我使用 java.util.logging 框架来记录我的程序状态。为了避免日志文件太大,我使用了这个 Filehandler 构造函数:

//import java.util.logging.FileHandler;
//import java.util.logging.Logger;

FileHandler fileLog = new FileHandler("log%g.txt", 10 * 1024*1014, 2, false);
logger.addHandler(fileLog);

据我了解,记录器现在写入 log0.txt,直到文件大小大于 10MB。然后他变成了log1.txt。当文件大小大于 10 MB 时,他变回 log0.txt。这样对吗?

所以在这种情况下,旧的日志文件将被覆盖。为避免这种情况,我想在记录器更改输出文件时调用 Methode(我在其中向管理员发送电子邮件)。

void callOnOutputfileChanged() {
  sendEmailToAdmin();
}

你知道如何应对这个事件吗?

When file size is bigger than 10 MB he changes back to log0.txt. Is this right?

正常情况下是的。如果 FileHandler 无法获取文件的锁,则会发生一些其他规则。

So in this case the old log files will be overwritten. To avoid this I want to call a Methode (in which I send a email to the administrator), when the logger changes the output file.

目前唯一监听 FileHandler 旋转的方法是扩展 FileHandler and override the protected void setOutputStream(OutputStream) 方法。 FileHandler 级别在旋转期间设置为 OFF。这是一个例子 class:

    public class ListeningFileHandler extends FileHandler {

        public ListeningFileHandler() throws IOException {
            super();
        }

        @Override
        protected synchronized void setOutputStream(OutputStream out) throws SecurityException {
            super.setOutputStream(out);
            if (Level.OFF.equals(super.getLevel())) { //Rotating...
                sendEmailToAdmin();
            }
        }

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

如果你想防止旋转,那么你必须改变你的目标。您要么必须离开限制并增加计数,要么必须降低计数并增加限制。