FileHandler.limit Java 7 не работает

1

У меня проблема с 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

кто-нибудь имеет схожую проблему? это может произойти при высокой нагрузке?

заранее спасибо

  • 0
    Является ли ваша опубликованная конфигурация всей конфигурацией? Я пропускаю строку как handlers = java.util.logging.FileHandler
  • 0
    Есть еще несколько свойств конфигурации: обработчики: java.util.logging.ConsoleHandler, java.util.logging.FileHandler .level = INFO 'java.util.logging.ConsoleHandler.level = INFO util.logging.SimpleFormatter»
Показать ещё 4 комментария
Теги:
file
logging
filehandler

1 ответ

0

Что-то перезаписывает ваши свойства 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню