2014-09-08 4 views
1

У меня есть проблемы с java.util.logging.FileHandler.limit собственности как размер файла превышает предельный размер здесь используются свойства в моем приложенииFileHandler.limit Java 7 не работает

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 Server 2012 Java 7

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

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

+0

размещен ваш конфиг всю конфигурацию? Мне не хватает строки, например 'handlers = java.util.logging.FileHandler' – Korashen

+0

. Больше свойств свойств обработчиков = java.util.logging.ConsoleHandler, java.util.logging.FileHandler .level = INFO 'java.util .logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter ' – user1996632

+0

Я также заметил, что количество и размер работы будут в первом рулоне, а затем, когда 10-й файл достигнет предела больше и продолжить запись в последний файл в порядке – user1996632

ответ

0

Нечто переустановка своих свойств LogManager или вы работаете, чтобы java.util.logging.FileHandler integer overflow prevents file rotation. Попытайтесь установить следующий форматтер, который смотрит на условия, которые предотвращают вращение.

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

Затем выполните поиск файла журнала, чтобы узнать, не нашли ли он что-либо.

Update: Oracle работает этот вопрос в JDK-8059767 FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.

Смежные вопросы