У меня проблема с java.util.logging.FileHandler.limit свойство, так как размер файла превысил размер лимита, здесь используются свойства в моем приложении
java.util.logging.FileHandler.pattern = ATMChannelAdapter%u.log
java.util.logging.FileHandler.limit = 2000000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
он отлично работает, а затем в какой-то момент приложение записывает только в один файл без ограничений, превышающих размер файла конфигурации размером 1 ГБ примерно и обратно до нормальной конфигурации. Я должен перезапустить приложение.
операционная система - это сервер Windows 2012 java 7
кто-нибудь имеет схожую проблему? это может произойти при высокой нагрузке?
заранее спасибо
Что-то перезаписывает ваши свойства LogManager или вы работаете в java.util.logging.FileHandler integer overflow предотвращает вращение файла. Попытайтесь установить следующий форматтер, который смотрит на условия, которые предотвращают вращение.
public class FileSimpleFormatter extends SimpleFormatter {
private static final Field METER;
private static final Field COUNT;
static {
try {
METER = FileHandler.class.getDeclaredField("meter");
METER.setAccessible(true);
COUNT = FileHandler.class.getDeclaredField("count");
COUNT.setAccessible(true);
} catch (RuntimeException re) {
throw re;
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
private volatile FileHandler h;
@Override
public String getHead(Handler h) {
this.h = FileHandler.class.cast(h);
return super.getHead(h);
}
private String check() {
FileHandler target = h;
if (target != null) {
try {
Object os = METER.get(target);
if (os != null && os.getClass().getName().endsWith("MeteredStream")) {
Field written = os.getClass().getDeclaredField("written");
written.setAccessible(true);
Number c = Number.class.cast(COUNT.get(target));
Number w = Number.class.cast(written.get(os));
if (c.intValue() <= 0 || w.intValue() < 0) {
return String.format("target=%1$s count=%2$s written=%3$s%n",
target, c, w);
}
}
} catch (IllegalAccessException ex) {
throw (Error) new IllegalAccessError(ex.getMessage()).initCause(ex);
} catch (NoSuchFieldException ex) {
throw (Error) new NoSuchFieldError(ex.getMessage()).initCause(ex);
}
}
return "";
}
@Override
public String format(LogRecord record) {
return super.format(record).concat(check());
}
}
Затем найдите файл журнала, чтобы узнать, не нашел ли он что-либо.
Обновление: Oracle работает над этой проблемой в JDK-8059767. FileHandler должен допускать "длинные" ограничения и обрабатывать переполнение MeteredStream.written.
handlers = java.util.logging.FileHandler