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配置文件实现:
- 找到JRE安装路径下
lib/logging.properties文件,或者自己新建一个自定义配置文件 - 修改/添加配置项:
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 - 如果用自定义配置文件,启动程序时添加JVM参数指定配置路径即可:
java -Djava.util.logging.config.file=./my-logging.properties 你的主类名
内容的提问来源于stack exchange,提问作者Ram Pr
相关产品推荐
相关产品推荐

