【问题标题】:util.logging.SimpleFormatter.format does not work (java 8)util.logging.SimpleFormatter.format 不起作用(java 8)
【发布时间】:2018-09-03 14:44:10
【问题描述】:

我正在尝试为我的应用程序设置一个记录器,我想通过为此项目指定的 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以下支持的格式吗?

【问题讨论】:

  • 一般来说,您应该提供最少的代码来重现问题,如果可能的话,您得到的输出
  • 第一个调用者的属性是loaded into a static field。一旦设置,图案就不能改变。因此,您必须注意在读取 logging.properties 之前加载模式的情况。

标签: java logging


【解决方案1】:

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

Test.java:

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

logger.properties:

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

控制台:

[2018-09-03 18:52:26] [   INFO] hey 

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

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

祝你好运。

【讨论】:

  • 我不知道你为什么要使用 JUL,当有更好的(我知道的)替代品时..
  • 您认为最好的选择是什么?为什么?
  • 在代码中我建议尽可能使用 slf4j。然后你可以选择不同的实现在 slf4j 之上使用。推荐的实现包括 logback 和 log4j2。我建议在代码中使用 slf4j,因为它可以让您轻松: 1. 将代码作为库提供 2. 如果您觉得我会推荐 logback/log4j2 而不是 JUL,则交换记录器实现,因为它们更快并且支持许多功能七月没有。
【解决方案2】:

我已经设法解决了这个问题。似乎问题出在创建一个新的 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 中它工作得很好。

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2012-06-25
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多