0

在我的 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();
}

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

4

1 回答 1

1

当文件大小大于 10 MB 时,他会更改回 log0.txt。这是正确的吗?

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

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

目前,监听 FileHandler 何时旋转的唯一方法是扩展FileHandler并覆盖受保护的 void setOutputStream(OutputStream)方法。FileHandler 级别在旋转期间设置为 OFF。这是一个示例类:

    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() {
            //...
        }
    }

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

于 2015-02-21T20:16:01.513 回答