当前位置: 首页 > 面试题库 >

如何使用简单格式化程序修改日志格式?

程峻
2023-03-14
问题内容

我尝试将这行添加到logging.properties中,但是输出不会改变

java.util.logging.SimpleFormatter.format='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n'

我也尝试了System.setProperty,但仍然无法正常工作,我在做什么错?

import java.util.*;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.io.*;
import java.awt.*;

public class LoggerFormat
{
private static final Logger logger = Logger.getLogger(LoggerFormat.class.getName());

public static void main(String[] args)
{
    System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tF %1$tT %4$s %2$s %1$tL");
    SimpleFormatter sf = new SimpleFormatter();
    System.out.println("-- main method starts --");
    logger.info("in LoggerFormat");
    logger.warning("a test warning");
}
}

问题答案:

一堆东​​西可能在这里出错。首先,请确保您正在运行的Java版本(7
b138)已修复了JDK-6381464的问题:SimpleFormatter应该使用一种单行格式。

文档中未解释的一件事是,仅当您通过命令行设置模式且模式包含空格字符时,才需要在模式上加引号。

因此,如果要在logging.properties中设置格式,则请删除引号:

java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n

如果要将格式设置为系统属性,则必须在启动时进行设置:

-Djava.util.logging.SimpleFormatter.format="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n"

接下来要做的是使用测试程序来验证您的模式是否已编译。如果模式语法错误,则SimpleFormatter将退回到默认模式。这是一个示例测试程序:

public static void main(String[] args) throws Exception {
    final String format = "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n";
    final String key = "java.util.logging.SimpleFormatter.format";
    test(format);
    test(System.getProperty(key, format));
    test(LogManager.getLogManager().getProperty(key));
    test(new SimpleFormatter());
}

private static void test(Formatter f) {
    LogRecord record = newLogRecord();
    System.out.println(f.format(record));
}

private static LogRecord newLogRecord() {
    LogRecord r = new LogRecord(Level.INFO, "Message");
    r.setSourceClassName("sourceClassName");
    r.setSourceMethodName("sourceMethodName");
    r.setLoggerName("loggerName");
    return r;
}

private static void test(String format) {
    if (format != null) {
        LogRecord record = newLogRecord();
        Throwable t = record.getThrown();
        System.out.println(String.format(format,
                new java.util.Date(record.getMillis()),
                record.getSourceClassName(),
                record.getLoggerName(),
                record.getLevel().getLocalizedName(),
                record.getMessage(),
                t != null ? t.toString() : ""));
        //TODO: Place printStackTrace into a string.
    } else {
        System.out.println("Format is null.");
    }
}

最后,该格式只能在启动时设置一次。加载SimpleFormatter后,该模式将在类的整个生命周期中使用。System.setProperty仅当您在开始记录之前设置了模式时,使用才会起作用,因此,不要依赖于在复杂程序中使用的路由。



 类似资料:
  • 如何在Java中解析“Tue Jun 05 00:00:00 GMT 05:30 2012”文本到日期?我使用了“EEE-MMM-dd-HH:mm:ss-z-yyyy”格式,但不起作用。

  • 我正在尝试将DatePicker日期格式化为简单的数据格式(“yyyy-MM-dd HH: mm: ss Z”)。有人告诉我,我需要使用简单的数据格式将其解析为日期对象-简单的数据格式(“yyyy-MM-dd”),然后将其格式化为我需要的内容,如下所示。但是,我在尝试捕捉块中收到错误“重复局部变量eDate”。任何专家都可以查看我的代码并提出建议吗? 已更新

  • 给定一个带有一个字符串字段的简单protobuf消息: 和打印它的示例代码: 此输出的结果将是: 每个消息(实际上是每个字段)都有“\n”换行符。这显然对伐木工人不利。 用Gson序列化会更糟,因为Gson将序列化生成的许多其他字段... 我们如何将protobuf消息转换为没有换行符的单个字符串?

  • 我正在研究spring-boot和gradle,以创建一个rest服务。现在我需要将json日期格式设置为“yyyy-MM-dd”,即格式应为dateOfBirth:“16-03-2015”,但我得到的是“dateOfBirth:-751181400000”。我在我的应用程序中添加了以下代码。java类,但仍然无法获得所需的输出。 和应用程序.java: 请帮我解决这个问题。

  • 问题内容: 我的python脚本中有一个数字,希望用作matplotlib中图形标题的一部分。是否有将浮点数转换为格式化的TeX字符串的函数? 基本上, 退货 但是我想要 或至少让matplotlib格式化浮点格式,就像格式化第二个字符串一样。我也一直使用python 2.4,因此特别喜欢在旧版本中运行的代码。 问题答案: 您可以执行以下操作: 在旧样式中:

  • 这涉及pylint和python日志记录。以下代码不起作用: 它提出: 如何使用{}样式而不是%s使日志记录工作? 我在测试我的模块时使用这个basicConfig,但我的包中也可以有一个更高级的格式化程序。我开始探索这一点的原因是因为pylint在我使用f字符串时抱怨,但当我使用(%s)的旧格式时也抱怨。