java.util.logging.Logger не уважает java.util.logging.Level? - PullRequest
49 голосов
/ 22 января 2009

В простой среде Java SE 6:

Logger l = Logger.getLogger("nameless");
l.setLevel(Level.ALL);
l.fine("somemessage");

Ничего не отображается в консоли Eclipse. l.info ("") и выше работает просто отлично, но все, что ниже отлично просто не работает. Что может быть не так? ТИА.

Ответы [ 6 ]

55 голосов
/ 22 января 2009

Даже если для уровня Logger установлено значение ALL, ConsoleHandler (обработчик по умолчанию для регистратора) по-прежнему имеет уровень INFO по умолчанию. Это происходит из свойств logging.properties по умолчанию в JAVA_HOME / jre / lib

35 голосов
/ 11 июня 2009

Вместо циклического прохождения всех обработчиков и установки уровня ведения журнала, я предпочитаю устанавливать только уровень обработчика консоли:

//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);
17 голосов
/ 22 октября 2009

Человек на моем рабочем месте нашел для работы следующее:

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 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 выводится.

2 голосов
/ 01 сентября 2014

Вам необходимо установить уровень регистрации как на обработчиках в регистраторе, так и на самом регистраторе. Регистрация ведется только на самом грубом из двух уровней. Вот класс ведения журнала, который делает эту работу.

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);
    }

}
2 голосов
/ 23 января 2011

Другие пользователи уже дали хороший ответ, почему это произошло (ConsoleHandler имеет отдельную переменную уровня). Я повторно использую уровень своего приложения-регистратора и копирую его в родительский раздел. Также предоставляет простой способ обновления уровней во время выполнения в любое время, когда я захочу.

// 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();
}
1 голос
/ 31 октября 2011
private final static Logger LOGGER = Logger.getLogger(WoTServer.class.getName());
for(Handler h : LOGGER.getParent().getHandlers()){
    if(h instanceof ConsoleHandler){
        h.setLevel(Level.ALL);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...