【问题标题】:java.util.logging. console handler doesn't logs messages below the INFO leveljava.util.logging。控制台处理程序不会记录低于 INFO 级别的消息
【发布时间】:2020-12-30 20:50:07
【问题描述】:

以下是我的记录器的代码。记录到文件完美无缺,但控制台处理程序不会在 Level.INFO 下方打印任何消息。

public class ServerLogger {

    /*
     * Log file size 
     */
    final private static int FILE_SIZE = 1024 * 100;

    /**
     * Creates and return server logger
     * 
     * @param dir log files directory
     * @param consoleEnabled if set to true then logging to console is enabled 
     * @param debugEnabled if set to true then debug level of logging is enabled
     * 
     * @return sever logger
     * 
     * @throws SecurityException
     * @throws IOException
     */
    public static Logger getLogger(final String dir, final boolean consoleEnabled, final boolean debugEnabled) 
    throws SecurityException, IOException {

        Logger logger = Logger.getLogger(Server.class.getName());
        logger.setUseParentHandlers(false);
    
        /* 
         * remove all handlers if any
         */
        Handler[] handlers = logger.getHandlers();
        
        if (handlers.length > 0) {
            for (Handler handler : handlers)
                logger.removeHandler(handler);
        }
                
        /*
         * create formatter 
         */
        Formatter formatter = new LineFormatter();
        
        /*
         * if console logging is enabled then add console handler
         */
        if (consoleEnabled) {
            ConsoleHandler consoleHandler =  new ConsoleHandler();
            consoleHandler.setFormatter(formatter);
            logger.addHandler(consoleHandler);
        }
    
        
        /*
         * add file handler
         */
        String nameTemplate = dir + "\\" + "server-log%g.txt";

        FileHandler fileHandler = new FileHandler(nameTemplate, FILE_SIZE, 10);
        fileHandler.setFormatter(formatter);
        logger.addHandler(fileHandler);
        
            
        Level level = debugEnabled ? Level.FINE : Level.INFO;
        logger.setLevel(level);
        
        return logger;
    }

    
    static private class LineFormatter extends Formatter {

        @Override
        public String format(LogRecord record) {
            return String.format("[%1$tF %1$tT] [%4$-7s] %5$s %n", record.getMillis(), record.getSourceMethodName(),
                   record.getLoggerName(), record.getLevel(), record.getMessage(), record.getThrown());
        }
    };
    
    
    
    public static void main(String[] args) throws SecurityException, IOException {
        
        //test
        Logger logger = ServerLogger.getLogger("C:\\logs", true, true);
        
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
            
    } 

我用StreamHandler 替换了ConsoleHandler,但这并没有帮助。 用logger.setLevel(Level.ALL) 替换logger.setLevel(level) 也无济于事。使用handler.set(Level level) 设置处理程序级别不会改变任何东西。 控制台上的消息是:

[2020-12-30 22:09:59] [SEVERE ] severe 
[2020-12-30 22:10:00] [WARNING] warning 
[2020-12-30 22:10:00] [INFO   ] info 

你能帮忙吗?

【问题讨论】:

    标签: java java.util.logging


    【解决方案1】:

    始终固定您的记录器,使其不会被垃圾收集。这样做是这样的:

    private static final Logger logger = Logger.getLogger(Server.class.getName());
    

    如果记录器被垃圾收集,所有更改都会丢失并回退到 logging.properties。

    下一个问题是,如果您以编程方式删除处理程序,您也必须关闭它们。

     if (handlers.length > 0) { //The if is not needed, just the for loop.
            for (Handler handler : handlers) {
                logger.removeHandler(handler);
                handler.close(); //Don't leak resources.
            }
     }
    

    下一个问题是您必须将控制台处理程序级别设置为全部:

    ConsoleHandler consoleHandler =  new ConsoleHandler();
    consoleHandler.setFormatter(formatter);
    consoleHandler.setLevel(Level.ALL);
    //consoleHandler.setLevel(debugEnabled ? Level.FINE : Level.INFO); //This would work too.
    

    这允许您的处理程序接受低于INFO 的日志记录。

    虽然使用静态方法来设置日志配置“有效”,但您实际上只想设置一次配置。在运行时更改记录器树是不切实际的,可能会导致您丢失消息。您应该使用logger configuration file, a logger class, or a static initializer block,以便配置加载一次且仅加载一次。

    小心使用 StreamHandler + System.err 或 System.out。 StreamHandler 的关闭隐式或显式将关闭它正在包装的系统流,这将停止所有输出到控制台。 ConsoleHandler 不会这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多