Как я могу отключить обработчик консолей по умолчанию при использовании Java, регистрирующего API?

Привет я пытаюсь реализовать 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. ??");
    }
}
89
задан Peter Rader 21 August 2016 в 11:13
поделиться

3 ответа

Консольный обработчик по умолчанию прикреплен к корневому логгеру, который является родителем всех остальных логгеров, включая ваш. Поэтому я вижу два пути решения вашей проблемы:

Если это касается только данного класса, то самым простым решением будет отключить передачу логов родительскому логгеру:

logger.setUseParentHandlers(false);

Если вы хотите изменить это поведение для всего приложения, вы можете вообще удалить обработчик консоли по умолчанию из корневого логгера, прежде чем добавлять свои собственные обработчики:

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

Примечание: если вы хотите использовать те же обработчики логов и в других классах, то лучшим способом будет перенести конфигурацию логов в конфигурационный файл.

101
ответ дан 24 November 2019 в 07:12
поделиться

Это странно, но Logger.getLogger ("global") не работает в моей настройке (а также Logger.getLogger (Logger.GLOBAL_LOGGER_NAME) ).

Однако Logger.getLogger ("") хорошо справляется со своей задачей.

Надеюсь, эта информация также поможет кому-нибудь ...

19
ответ дан 24 November 2019 в 07:12
поделиться

Просто сделай

LogManager.getLogManager().reset();
105
ответ дан 24 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: