Привет, я пытаюсь реализовать ведение журнала 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. ??");
}
}
java
java.util.logging
громко
источник
источник
b.append(formatMessage(arg0))
вместоb.append(arg0.getMessage())
. С помощьюformatMessage
метода вы делаете ваш форматтер совместимым с использованиемpublic void log(Level level, String msg, Object param1)
и аналогичными методами.Ответы:
Обработчик консоли по умолчанию прикреплен к корневому регистратору, который является родительским для всех других регистраторов, включая ваш. Итак, я вижу два пути решения вашей проблемы:
Если это влияет только на ваш конкретный класс, самым простым решением было бы отключить передачу журналов родительскому регистратору:
logger.setUseParentHandlers(false);
Если вы хотите изменить это поведение для всего приложения, вы можете полностью удалить обработчик консоли по умолчанию из корневого регистратора, прежде чем добавлять свои собственные обработчики:
Logger globalLogger = Logger.getLogger("global"); Handler[] handlers = globalLogger.getHandlers(); for(Handler handler : handlers) { globalLogger.removeHandler(handler); }
Примечание: если вы хотите использовать те же обработчики журналов и в других классах, лучший способ - в конечном итоге переместить конфигурацию журнала в файл конфигурации.
источник
LogManager.getLogManager().reset(); SLF4JBridgeHandler.install();
Просто делать
источник
Logger
поэтому это может быть проблемой для более сложной системы журналов. Это следует вызвать один раз в начале процесса, чтобы убедиться, что это не повлияет на Futur Logger. И, конечно же, тот, кому понадобится консоль, должен будет получитьConsoleHandler
как и ожидалось.Это странно, но
Logger.getLogger("global")
в моей настройке не работает (как иLogger.getLogger(Logger.GLOBAL_LOGGER_NAME)
).Однако
Logger.getLogger("")
делает свою работу хорошо.Надеюсь, эта информация также поможет кому-то ...
источник
Выполните сброс конфигурации и установите корневой уровень на ВЫКЛ.
источник
Вы должны указать своему регистратору, чтобы он не отправлял свои сообщения родительскому регистратору:
... import java.util.logging.*; ... Logger logger = Logger.getLogger(this.getClass().getName()); logger.setUseParentHandlers(false); ...
Однако это следует сделать перед добавлением дополнительных обработчиков в регистратор.
источник