Java.util.logging.Logger не уважает java.util.logging.Level?
В простой среде Java SE 6:
Logger l = Logger.getLogger("nameless");
l.setLevel(Level.ALL);
l.fine("somemessage");
В консоли Eclipse ничего не отображается. l.info("") и выше работает отлично, но ничего ниже штрафа просто не работает. Что может быть неправильным?
ТИА.
Ответы
Ответ 1
Несмотря на то, что для уровня Logger установлено значение ALL, ConsoleHandler (обработчик по умолчанию для регистратора) по-прежнему имеет уровень INFO по умолчанию. Это происходит из файла logging.properties по умолчанию в JAVA_HOME/jre/lib
Ответ 2
Вместо того, чтобы перебирать все обработчики и устанавливать уровень ведения журнала, я предпочитаю устанавливать только уровень обработчика консоли:
//get the top Logger
Logger topLogger = java.util.logging.Logger.getLogger("");
// Handler for console (reuse it if it already exists)
Handler consoleHandler = null;
//see if there is already a console handler
for (Handler handler : topLogger.getHandlers()) {
if (handler instanceof ConsoleHandler) {
//found the console handler
consoleHandler = handler;
break;
}
}
if (consoleHandler == null) {
//there was no console handler found, create a new one
consoleHandler = new ConsoleHandler();
topLogger.addHandler(consoleHandler);
}
//set the console handler to fine:
consoleHandler.setLevel(java.util.logging.Level.FINEST);
Ответ 3
Отдельно на моем рабочем месте было найдено следующее:
public class Foo {
private final static Logger logger = Logger.getLogger(Foo.class.getName());
public static final void main(String[] args) {
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.FINEST);
Foo.logger.addHandler(ch);
Foo.logger.setLevel(Level.FINEST);
Foo.logger.finest("test");
}
}
Если вы просто установите для корня или обработчика лучшие (исключительно), то это не сработало. Когда я устанавливаю оба в FINEST
, тогда он работает. Его объяснение было:
Оба регистратора и его обработчики имеют уровни журнала... Порядок фильтрации - это Logger then Handlers. Это означает, что он проверяет, первым ли передает сообщение журнала, а затем отправляет сообщение отдельным обработчикам для фильтрации.
Далее он объяснил это, используя следующие примеры:
-
Logger myLogger
имеет уровень FINEST
и один ConsoleHandler myHandler
, который имеет уровень INFO
-
myLogger.fine("foo")
Сообщение об ошибке заходит за фильтр регистраторов, но получает фильтр через фильтр обработчиков... ничего не выводит.
-
myLogger.info("foo")
à пропускает оба фильтра и выводится foo
.
Теперь...
-
Logger myLogger
имеет уровень INFO
и один ConsoleHandler myHandler
, который имеет уровень FINEST
-
myLogger.fine("foo")
Сообщение об остановке фильтром журналов и никогда не попадает в обработчик... Ничего не выводит.
-
myLogger.info("foo")
à пропускает оба фильтра и выводится foo
.
Теперь...
-
Logger myLogger
имеет уровень FINEST
и один ConsoleHandler myHandler
, который имеет уровень FINEST
-
myLogger.fine("foo")
à пропускает оба фильтра и выводится "foo
".
-
myLogger.info("foo")
à пропускает оба фильтра и выводится foo
.
Ответ 4
Другие пользователи уже дали хороший ответ, почему это произошло (ConsoleHandler имеет отдельную переменную уровня). Я повторно использую свой уровень регистратора приложений и копирую его в родительский hiearchy. Также предоставляет простой способ обновления уровней во время выполнения в любое время.
// Set same level all loggers and handlers up to the parent level
// OFF,SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST,ALL
Logger logger = Logger.getLogger(this.getClass().getPackage().getName());
//Level level = Level.parse("FINEST");
Level level = logger.getLevel();
Logger tempLogger = logger;
while(tempLogger != null) {
tempLogger.setLevel(level);
for(Handler handler : tempLogger.getHandlers())
handler.setLevel(level);
tempLogger = tempLogger.getParent();
}
Ответ 5
Вам необходимо установить уровень журнала как для обработчиков в журнале, так и для самого журнала. Ведение журнала выполняется только на "грубом" уровне двух уровней. Вот класс ведения журнала, который выполняет задание.
import java.io.PrintWriter;
import java.io.StringWriter;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class Log {
private static final Logger logger = Logger.getGlobal();
private static Level logLevel = Level.INFO;
static {
// Remove all the default handlers (usually just one console handler)
Logger rootLogger = Logger.getLogger("");
Handler[] rootHandlers = rootLogger.getHandlers();
for (Handler handler : rootHandlers) {
rootLogger.removeHandler(handler);
}
// Add our own handler
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(logLevel);
handler.setFormatter(new LogFormatter());
logger.addHandler(handler);
logger.setLevel(logLevel);
}
public static class LogFormatter extends Formatter {
@Override
public String format(LogRecord record) {
String stackTrace = "";
Throwable thrown = record.getThrown();
if (thrown != null) {
StringWriter stacktraceWriter = new StringWriter();
try (PrintWriter writer = new PrintWriter(stacktraceWriter)) {
thrown.printStackTrace(writer);
}
stackTrace = stacktraceWriter.toString();
}
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(record.getMillis()), ZoneId.of("UTC")).format(DateTimeFormatter.ISO_ZONED_DATE_TIME) + "\t" + record.getLevel()
+ "\t" + record.getMessage() + "\n" + stackTrace;
}
}
private static final String classname = Log.class.getName();
private static String callerRef() {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
if (stackTraceElements.length < 4) {
return "";
} else {
int i = 1;
for (; i < stackTraceElements.length; i++) {
if (stackTraceElements[i].getClassName().equals(classname)) {
break;
}
}
for (; i < stackTraceElements.length; i++) {
if (!stackTraceElements[i].getClassName().equals(classname)) {
break;
}
}
if (i < stackTraceElements.length) {
return stackTraceElements[i].toString();
} else {
return "[in unknown method]";
}
}
}
public static void setLogLevel(Level newLogLevel) {
logLevel = newLogLevel;
for (Handler handler : logger.getHandlers()) {
handler.setLevel(newLogLevel);
}
Log.logger.setLevel(newLogLevel);
}
public static int getLevelNum() {
return logLevel.intValue();
}
public static int getLevelNum(Level level) {
return level.intValue();
}
public static void fine(String msg) {
logger.log(Level.FINE, msg);
}
public static void info(String msg) {
logger.log(Level.INFO, msg);
}
public static void warning(String msg) {
logger.log(Level.WARNING, msg + "\t " + callerRef());
}
public static void error(String msg) {
logger.log(Level.SEVERE, msg + "\t " + callerRef());
}
public static void exception(String msg, Throwable cause) {
logger.log(Level.SEVERE, msg + "\t " + callerRef(), cause);
}
}
Ответ 6
private final static Logger LOGGER = Logger.getLogger(WoTServer.class.getName());
for(Handler h : LOGGER.getParent().getHandlers()){
if(h instanceof ConsoleHandler){
h.setLevel(Level.ALL);
}
}