How can I disable the default console handler, while using the java logging API?

Javajava.util.logging

Java Problem Overview


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 the default console handler. Does anyone know how to disable the default console handler. I only want to use the two handlers 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. ??");
	}
}

Java Solutions


Solution 1 - Java

Just do

LogManager.getLogManager().reset();

Solution 2 - Java

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.

Solution 3 - Java

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...

Solution 4 - Java

Do a reset of the configuration and set the root level to OFF

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

Solution 5 - Java

You must instruct your logger not to send its messages on up to its parent logger:

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

However, this should be done before adding any more handlers to logger.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionloudiyimoView Question on Stackoverflow
Solution 1 - JavaDominiqueView Answer on Stackoverflow
Solution 2 - JavaPéter TörökView Answer on Stackoverflow
Solution 3 - JavaDimeView Answer on Stackoverflow
Solution 4 - JavaManuelView Answer on Stackoverflow
Solution 5 - JavaJustSayinView Answer on Stackoverflow