在我的java服务器中,我使用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();
}
您是否知道如何应对此事件?
答案 0 :(得分:1)
当文件大小超过10 MB时,他会更改回log0.txt。这是对的吗?
在正常情况下是的。如果FileHandler无法获取文件锁定,则会发生其他一些规则。
因此,在这种情况下,旧的日志文件将被覆盖。为了避免这种情况,我想在记录器更改输出文件时调用Methode(我向管理员发送电子邮件)。
目前,在FileHandler旋转时监听的唯一方法是扩展FileHandler并覆盖protected 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() {
//...
}
}
如果您想阻止轮换,那么您必须改变目标。您必须离开限制并增加计数或降低计数并增加限制。