2012-12-07 18 views
7

Chciałbym móc poinformować maszynę JVM, aby zaprzestała rejestrowania określonego poziomu komunikatów w pewnym momencie łańcucha wykonawczego. W pewnym momencie chcę tylko komunikaty dziennika z SEVERE poziomie, więc myślałem w ten sposób:Java - dynamicznie zmieniaj poziom rejestrowania

for(Enumeration<String> loggerNames = logManager.getLoggerNames(); loggerNames.hasMoreElements();){ 
     String name = loggerNames.nextElement(); 
     Logger nextLogger = logManager.getLogger(name); 
     if(nextLogger != null) 
      nextLogger.setLevel(Level.SEVERE); 
    } 

Czy istnieje przejrzysty sposób, aby osiągnąć tę samą logikę czyli ustawić zmienną globalną, która zatrzyma drukowanie do logowania, chyba SILNY? Muszę rozróżnić dane wyjściowe konsoli (w teście) i dane wyjściowe pliku na żywo, więc mógłbym ustawić te poziomy na module obsługi (konsoli i pliku)?

+0

Myślę, że potrzebujesz plików właściwości logowania java. Sprawdź to http://www.javapractices.com/topic/TopicAction.do?Id=143 –

+1

Nie, chcę użyć zmian DYNAMIC – Bober02

Odpowiedz

6

odpowiedzi na moje własne pytanie:

To jest dokładnie to, co potrzebne:

Handler[] handlers = 
    Logger.getLogger("").getHandlers(); 
for (int index = 0; index < handlers.length; index++) { 
    handlers[index].setLevel(Level.SEVERE); 
} 
+0

To działało również dla mnie. Zaletą tego podejścia opartego na czystym java jest to, że mogę to robić również w świetnych warunkach, gdy biblioteki mają za dużo rejestrowania na domyślnym poziomie (patrzę na ciebie Apache SSHD). –

0

Aby dynamicznie kontrolować konfigurację aplikacji, często używa się JMX.

JConsole, część jdk, umożliwia ręczną kontrolę MBean, ale można również uzyskać do nich dostęp programowo.

Możesz używać JMX do kontrolowania MBean, jak opisano w this page.

0

Za pomocą log4j można zmienić poziom w programie rejestrującym root.

to może działać:

logManager.getLogger("").setLevel(Level.SEVERE); 

lub użyj Logger.getParent(), aby znaleźć rejestratora korzeniowy

Powiązane problemy