Как отключить обработчик консоли по умолчанию, используя API-интерфейс java logging?
Привет, Я пытаюсь реализовать запись в 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
Обработчик консоли по умолчанию подключается к корневому журналу, который является родителем всех других регистраторов, включая ваши. Поэтому я вижу два способа решить вашу проблему:
Если это влияет только на ваш конкретный класс, самым простым решением было бы отключить передачу журналов до родительского регистратора:
logger.setUseParentHandlers(false);
Если вы хотите изменить это поведение для своего приложения, вы можете удалить обработчик консоли по умолчанию из корневого регистратора, прежде чем добавлять собственные обработчики:
Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
globalLogger.removeHandler(handler);
}
Примечание. Если вы хотите использовать одни и те же обработчики журналов в других классах, лучше всего переместить конфигурацию журнала в файл конфигурации в конечном итоге.
Ответ 2
Просто сделай
LogManager.getLogManager().reset();
Ответ 3
Это странно, но Logger.getLogger("global")
не работает в моей настройке (а также Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)
).
Однако Logger.getLogger("")
выполняет работу хорошо.
Надеюсь, эта информация также поможет кому-то...
Ответ 4
Сделайте reset конфигурации и установите для корневого уровня значение OFF
LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(java.util.logging.Level.OFF);
Ответ 5
Вы должны указать своему регистратору не отправлять сообщения на него родительский регистратор:
...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
Однако это нужно сделать, прежде чем добавлять к регистратору еще больше обработчиков.