views:

699

answers:

3

Hi I am trying to implement the java logging in my application. I want to use two handlers. A file handler and my own console handler. Both of my handlers work fine. My logging is send to a file and to the console . My logging is also sent to the default console handler, which i do not want. If you run my code you will see extra two line sent to the console. I don't want to use de default console handler. Does anyone know how to disable the default console handler. I only want to use the two hadlers i have created.

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. ??");
}

}

+2  A: 

The default console handler is attached to the root logger, which is a parent of all other loggers including yours. So I see two ways to solve your problem:

If this is only affects this particular class of yours, the simplest solution would be to disable passing the logs up to the parent logger:

logger.setUseParentHandlers(false);

If you want to change this behaviour for your whole app, you could remove the default console handler from the root logger altogether before adding your own handlers:

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

Note: if you want to use the same log handlers in other classes too, the best way is to move the log configuration into a config file in the long run.

Péter Török
setUseParentHandlers method works, thanks. how can i remove the default console handler from the root logger ?
loudiyimo
@loudiyimo just added the example :-)
Péter Török
thanks you for your help
loudiyimo
+1  A: 

This is strange but Logger.getLogger("global") does not work in my setup (as well as Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

However Logger.getLogger("") does the job well.

Hope this info also helps somebody...

Dime
A: 

Just do

LogManager.getLogManager().reset();
Dominique