2010-03-28 19 views
83

Hola, estoy tratando de implementar el registro java en mi aplicación. Quiero usar dos controladores. Un manejador de archivos y mi propio controlador de consola. Mis dos controladores funcionan bien. Mi registro se envía a un archivo y a la consola. Mi registro también se envía al controlador de consola predeterminado, que no quiero. Si ejecuta mi código, verá dos líneas adicionales enviadas a la consola. No quiero usar el controlador de consola predeterminado. ¿Alguien sabe cómo deshabilitar el controlador de consola predeterminado? Solo quiero usar los dos controladores que he creado.¿Cómo puedo desactivar el controlador de consola predeterminado, mientras uso la API de registro de 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

¿Puedo sugerir gentilmente usar 'b.append (formatMessage (arg0))' en lugar de 'b.append (arg0.getMessage())'. Con el método 'formatMessage' está haciendo que su formateador sea compatible con el uso de' public void log (Level level, String msg, Object param1) 'y métodos similares. – Victor

Respuesta

88

El controlador de consola predeterminada se une al registrador de la raíz, que es uno de los padres de todos los otros madereros, incluida la suya. Así veo dos formas de resolver su problema:

Si esto sólo se afecta a esta clase particular de la suya, la solución más sencilla sería la de desactivar pasar los troncos hasta el registrador de los padres:

logger.setUseParentHandlers(false); 

Si querer cambiar este comportamiento para toda la aplicación, se puede quitar el controlador de consola predeterminada desde el registrador de la raíz por completo antes de añadir sus propios controladores:

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

Nota: si desea utilizar los mismos controladores de registro en otras clases también , la mejor manera es mover th e log configuración en un archivo de configuración en el largo plazo.

+2

El método setUseParentHandlers funciona, gracias. ¿Cómo puedo eliminar el controlador de consola predeterminado del registrador de raíz? – loudiyimo

+0

@loudiyimo acaba de agregar el ejemplo :-) –

+9

También podría usar Logger.getLogger ("") - esto funciona para mí donde "global" no (¿puede ser el resultado de SLF4J en la mezcla?) – sehugg

17

Esto es extraño pero Logger.getLogger("global") no funciona en mi configuración (así como en Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

Sin embargo, Logger.getLogger("") hace bien el trabajo.

Esperanza esta información también ayuda a alguien ...

+3

alguien puede decirnos por qué getLogger (Logger .GLOBAL_LOGGER_NAME) no funciona pero getLogger ("") sí? – deinocheirus

+2

@deinocheirus vea mi comentario a esta [respuesta] (http://stackoverflow.com/a/2533250/323447) –

91

Eso sí,

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

Debe ser la respuesta correcta –

+1

Gracias, esta es la respuesta correcta. La respuesta marcada como correcta, no funciona. –

+1

Esto funciona y debería ser la respuesta aceptada, de hecho – BullyWiiPlaza

9

realizar un restablecimiento de la configuración y ajuste el nivel de la raíz en OFF

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

debe indicar su logger para no enviar sus mensajes hasta su registrador principal:

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

Sin embargo, esto debe hacerse antes de agregar más manejadores al registrador.

Cuestiones relacionadas