You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用java.util.logging如何将日志信息与前缀打印在同一行

问题原因

Java自带的java.util.logging日志框架默认使用SimpleFormatter作为格式化器,其默认格式模板为%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%6$s%n,模板中的%n就是换行符。你看到的两行拆分是因为模板在调用类/方法信息后主动加了一次换行,才输出日志级别和内容。

你之前在日志内容里加\n反而多空行,是因为模板末尾已经自带了一个全局换行,内容里额外加的换行就会多出来空行。

解决方案

有两种常用实现方式,二选一即可:

方式1:代码中直接自定义格式化规则

直接给Logger绑定的Handler设置自定义格式的SimpleFormatter,示例代码如下:

import java.util.logging.ConsoleHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.logging.LogRecord;
import java.util.Date;

public class PdmsMigration {
    static Logger logger = Logger.getLogger(PdmsMigration.class.getName());
    static {
        // 禁用父类默认Handler
        logger.setUseParentHandlers(false);
        // 新建控制台输出Handler
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // 自定义格式模板:去掉元数据后的换行符,仅在整条日志末尾保留一次换行
        String customPattern = "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s %4$s: %5$s%6$s%n";
        SimpleFormatter customFormatter = new SimpleFormatter() {
            @Override
            public String format(LogRecord record) {
                return String.format(customPattern,
                        new Date(record.getMillis()),
                        record.getSourceClassName() + " " + record.getSourceMethodName(),
                        record.getLoggerName(),
                        record.getLevel().getLocalizedName(),
                        formatMessage(record),
                        record.getThrown() != null ? " " + record.getThrown() : ""
                );
            }
        };
        consoleHandler.setFormatter(customFormatter);
        logger.addHandler(consoleHandler);
    }

    public static void main(String[] args) {
        String file = "testFile";
        logger.info("Processing " + file);
    }
}

方式2:修改日志配置文件

如果不想改代码,可以通过调整logging配置文件实现:

  1. 找到JRE安装路径下lib/logging.properties文件,或者自己新建一个自定义配置文件
  2. 修改/添加配置项:
    java.util.logging.SimpleFormatter.format=%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s %4$s: %5$s%6$s%n
    
  3. 如果用自定义配置文件,启动程序时添加JVM参数指定配置路径即可:
    java -Djava.util.logging.config.file=./my-logging.properties 你的主类名

内容的提问来源于stack exchange,提问作者Ram Pr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:30:04