2010-03-28 9 views
83

Witam Próbuję zaimplementować rejestrowanie Java w mojej aplikacji. Chcę użyć dwóch programów obsługi. Obsługa plików i moja własna obsługa konsoli. Obaj z moich opiekunów działają dobrze. Moje logowanie jest wysyłane do pliku i do konsoli. Moje logowanie jest również wysyłane do domyślnego programu obsługi konsoli, którego nie chcę. Jeśli uruchomisz mój kod, zobaczysz dodatkowe dwie linie wysłane do konsoli. Nie chcę używać domyślnego programu obsługi konsoli. Czy ktoś wie, jak wyłączyć domyślną obsługę konsoli. Chcę użyć tylko dwóch procedur obsługi, które utworzyłem.Jak wyłączyć domyślną procedurę obsługi konsoli podczas korzystania z interfejsu API rejestrowania w języku Java?

Handler fh = new FileHandler("test.txt"); 
fh.setFormatter(formatter); 
logger.addHandler(fh); 

Handler ch = new ConsoleHandler(); 
ch.setFormatter(formatter); 
logger.addHandler(ch); 

import java.util.Date; 
import java.util.logging.ConsoleHandler; 
import java.util.logging.FileHandler; 
import java.util.logging.Formatter; 
import java.util.logging.Handler; 
import java.util.logging.Level; 
import java.util.logging.LogManager; 
import java.util.logging.LogRecord; 
import java.util.logging.Logger; 

public class LoggingExample { 
    private static Logger logger = Logger.getLogger("test"); 

    static { 
     try { 
      logger.setLevel(Level.INFO); 

      Formatter formatter = new Formatter() { 

       @Override 
       public String format(LogRecord arg0) { 
        StringBuilder b = new StringBuilder(); 
        b.append(new Date()); 
        b.append(" "); 
        b.append(arg0.getSourceClassName()); 
        b.append(" "); 
        b.append(arg0.getSourceMethodName()); 
        b.append(" "); 
        b.append(arg0.getLevel()); 
        b.append(" "); 
        b.append(arg0.getMessage()); 
        b.append(System.getProperty("line.separator")); 
        return b.toString(); 
       } 

      }; 

      Handler fh = new FileHandler("test.txt"); 
      fh.setFormatter(formatter); 
      logger.addHandler(fh); 

      Handler ch = new ConsoleHandler(); 
      ch.setFormatter(formatter); 
      logger.addHandler(ch); 

      LogManager lm = LogManager.getLogManager(); 
      lm.addLogger(logger); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??"); 
    } 
} 
+1

Czy mogę delikatnie polecić użycie 'b.append (formatMessage (arg0))' zamiast 'b.append (arg0.getMessage())'. Metodą 'formatMessage' dostosowujesz swój formatator za pomocą' public void log (poziom poziomu, String msg, Object param1) 'i podobne metody. – Victor

Odpowiedz

88

Domyślna obsługi konsola jest podłączona do rejestratora korzeniowego, który jest rodzicem wszystkich innych rejestratorów, w tym Ciebie. Widzę dwa sposoby rozwiązania problemu:

Jeśli to dotyczy tylko tej konkretnej klasy Ciebie, najprostszym rozwiązaniem byłoby wyłączyć przechodząc dzienniki do rejestratora dominującej:

logger.setUseParentHandlers(false); 

Jeśli aby zmienić to zachowanie na całej swojej aplikacji, można usunąć obsługi domyślny konsoli z rejestratora korzenia całkowicie przed dodaniem własnych teleskopowe:

Logger globalLogger = Logger.getLogger("global"); 
Handler[] handlers = globalLogger.getHandlers(); 
for(Handler handler : handlers) { 
    globalLogger.removeHandler(handler); 
} 

Uwaga: jeśli chcesz korzystać z tych samych procedur obsługi dziennika w innych klasach zbyt , najlepszym sposobem jest przeniesienie th ekonfiguruj log w pliku konfiguracyjnym na dłuższą metę.

+2

Metoda setUseParentHandlers działa, dziękuję. jak mogę usunąć domyślną procedurę obsługi konsoli z głównego programu rejestrującego? – loudiyimo

+0

@loudiyimo właśnie dodał przykład :-) –

+9

Można również użyć Logger.getLogger ("") - działa to dla mnie, gdy "globalny" nie ma (może być wynikiem SLF4J w miksie?) – sehugg

17

To jest dziwne, ale Logger.getLogger("global") nie działa w mojej konfiguracji (jak również Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

Jednak praca Logger.getLogger("") dobrze spełnia swoje zadanie.

Nadzieja ta informacja pomaga również ktoś ...

+3

Czy ktoś może nam powiedzieć, dlaczego getLogger (Logger .GLOBAL_LOGGER_NAME) nie działa, ale getLogger ("") robi? – deinocheirus

+2

@deinocheirus zobacz mój komentarz do tej [odpowiedź] (http://stackoverflow.com/a/2533250/323447) –

91

Wystarczy zrobić

LogManager.getLogManager().reset(); 
+1

Powinna być poprawna odpowiedź –

+1

Dziękuję, to jest właściwa odpowiedź. Odpowiedź oznaczona jako poprawna, nie działa. –

+1

To działa i powinno być zaakceptowaną odpowiedzią. – BullyWiiPlaza

9

Czy reset konfiguracji i ustawienia poziomu root OFF

LogManager.getLogManager().reset(); 
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME); 
globalLogger.setLevel(java.util.logging.Level.OFF); 
4

Należy poinstruować program rejestrujący, aby nie wysyłać swoich wiadomości do nadrzędnego rejestratora:

... 
import java.util.logging.*; 
... 
Logger logger = Logger.getLogger(this.getClass().getName()); 
logger.setUseParentHandlers(false); 
... 

Należy to jednak zrobić przed dodaniem jakichkolwiek programów obsługi do programu rejestrującego.