util.logging.SimpleFormatter.format不起作用(java 8)

时间:2018-09-03 14:44:11

标签: java logging

我正在尝试为我的应用程序设置记录器,我想通过为此项目指定的logger.properties文件来执行此操作。我使用以下代码进行设置:

InputStream loggerProps = getClass().getResourceAsStream("/logger.properties");
LogManager.getLogManager().readConfiguration(loggerProps);

该文件包含以下文本:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
#part about FileHandler omitted

问题是给定的格式根本没有应用于记录的消息。但是,它仅在Java 8中不可用(也许也是早期版本,也没有检查)。当我在Java 9或10中尝试上述操作时,效果很好。

据我所知,文件已正确加载。在第一行中删除ConsoleHandler会导致日志不显示在控制台中。更改处理程序的级别也按预期工作。

如果我在设置属性后调用以下方法:

LogManager.getLogManager().getProperty("java.util.logging.SimpleFormatter.format")

它返回正确的格式字符串。

我尝试将格式字符串放在双引号和单引号中,但都不起作用。

我在做什么错?问题出在哪里? Java版本不支持低于9的格式吗?

2 个答案:

答案 0 :(得分:0)

所以我无法重现您的问题。

Test.java:


  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>

logger.properties:

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Test {
    private static Logger LOGGER;

    public static void main(String[] args) {
        InputStream loggerProps = Test.class.getResourceAsStream("/logger.properties");
        try {
            LogManager.getLogManager().readConfiguration(loggerProps);
            LOGGER= Logger.getLogger(Test.class.getName());
            LOGGER.info("hey");
        } catch (SecurityException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

控制台:

handlers= java.util.logging.ConsoleHandler.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$7s] %5$s %n

我还验证了更改格式会更改控制台消息格式。

您应验证:  1.您的进口是正确的  2.您的logger.properties位于源文件夹中

祝你好运。

答案 1 :(得分:0)

我设法解决了这个问题。似乎问题出在创建一个新的ConsoleHandler(我在设置记录程序属性之前已初始化的其他类中做了)。这是我的意思:

public final class Test {
    public static void main(String[] args) {
        Logger LOGGER = Logger.getLogger(Test.class.getName());
        try {
//            ConsoleHandler handler = new ConsoleHandler();
            InputStream loggerProps = new FileInputStream(new File("logger.properties"));
            LogManager.getLogManager().readConfiguration(loggerProps);
            LOGGER.info("hey");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }
}

如果您取消注释一条注释行,则记录器格式将不起作用。在Java 9或10中,它可以正常工作。