Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConsoleHandler将信息记录到控制台,尽管日志级别为警告_Java_Logging - Fatal编程技术网

Java ConsoleHandler将信息记录到控制台,尽管日志级别为警告

Java ConsoleHandler将信息记录到控制台,尽管日志级别为警告,java,logging,Java,Logging,在我的项目中,我使用了一些不同的记录器,它们都附带了一个文件处理程序和一个控制台处理程序。我使用以下类创建这些记录器: public class Logging { static { System.setProperty("java.util.logging.config.file", "properties/logging.properties"); try { LogManager.getLogManager().readConfiguration();

在我的项目中,我使用了一些不同的记录器,它们都附带了一个文件处理程序和一个控制台处理程序。我使用以下类创建这些记录器:

public class Logging {

static {
    System.setProperty("java.util.logging.config.file", "properties/logging.properties");
    try {
        LogManager.getLogManager().readConfiguration();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Method to create a new logger using java.util.logging.
 * @param name The name of the logger.
 * @param logLevelFile The log level for writing into the log file.
 * @param logLevelConsole The log level for writing on the console.
 * @param logToFile True, if file logging shall be active.
 * @param logToConsole True, if console logging shall be active.
 * @return The new logger instance.
 */
public static Logger createLogger(String name, Level logLevelFile, Level logLevelConsole, boolean logToFile, boolean logToConsole) {

    Logger logger = Logger.getLogger(name);
    logger.setLevel(Level.ALL);
    logger.setUseParentHandlers(false);

    if (logToFile) {
        final Handler fileHandler;
        try {

            fileHandler = new FileHandler("log/" + name + ".log");
            fileHandler.setLevel(logLevelFile);
            logger.addHandler(fileHandler);

            // close file handler, so that *.lck files will be deleted by
            // JVM
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                @Override
                public void run() {
                    fileHandler.close();
                }
            }));

        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (logToConsole) {

        // remove existing console handlers
        Handler[] handlers = logger.getHandlers();
        for (Handler handler : handlers) {
            if (handler.getClass() == ConsoleHandler.class)
                logger.removeHandler(handler);
        }

        Handler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(logLevelConsole);

        logger.addHandler(consoleHandler);

    }

    return logger;

}

}
如您所见,每个记录器都会得到一个布尔值,即它是否应该登录到文件和控制台。根据这一点,可以设置将记录到控制台或文件中的级别

我的logging.properties如下所示:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler

java.util.logging.ConsoleHandler.formatter  = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.formatter     = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format    = [%1$td.%1$tm.%1$tY-%1$tH:%1$tM:%1$tS] [%2$s] %4$s: %5$s %n

# approximate amount of bytes to write to a log file, before rotating to a new file
java.util.logging.FileHandler.limit = 500000

# number of log files to use in the log file rotation
java.util.logging.FileHandler.count = 0

# whether or not the FileHandler should append to an existing file or not (true or false)
java.util.logging.FileHandler.append = false
我按如下方式初始化我的记录器:

Logging.createLogger(Properties.getGeneralLoggerName(), Level.INFO, Level.INFO, true, true);
Logging.createLogger(Properties.getBluetoothLoggerName(), Level.INFO, Level.INFO, true, true);
Logging.createLogger(Properties.getStrategicProcessesLoggerName(), Level.INFO, Level.WARNING, true, true);
Logging.createLogger(Properties.getNetworkLoggerName(), Level.INFO, Level.WARNING, true, true);
Logging.createLogger(Properties.getGPIOLoggerName(), Level.INFO, Level.WARNING, true, true);
Logging.createLogger(Properties.getFatigueDetectionLoggerName(), Level.INFO, Level.WARNING, true, true);
Logging.createLogger(Properties.getGPSACCLoggerName(), Level.INFO, Level.WARNING, true, true);
问题是,例如,最后一个记录器不仅将警告记录到控制台中,而且还记录信息日志。在我的mac笔记本上,这一切都很好,但当我在我的嵌入式系统(Ubuntu14.04版的Odroid U3)上使用这段代码时,它失败了,控制台输出非常大。输出不是记录到文件中,而是记录到控制台中

有人能帮忙吗


谢谢

在示例代码中,您添加了一个关闭钩子来关闭FileHandler以删除“lck”文件。你必须这样做的原因是因为你是。你必须对你的日志保持强烈的引用

如果允许,则该记录器的下一个新实例将继承父记录器的级别设置,而不是“createLogger”方法中设置的级别

输出不是记录到文件中,而是记录到控制台中

FileHandler可以抛出异常。修复异常的原因。addShutdownHook方法还可以抛出代码中未捕获的异常