如何配置Java Util Logging以输出Log4j风格的日志格式?
实现类Log4j的自定义日志格式
需求格式回顾
目标输出格式:
2014-09-24 14:05:18 INFO CustomerController:96 - Starting purchase order...
对应要求:
- 单条日志独占一行
- 本地时间戳(不含时区)
- 级别左对齐,固定5字符长度(如
INFO补空格为INFO) - 显示类名(不含包路径)及行号
- 日志消息后缀
以下提供两种无需额外外部文件的实现方式:
1. 配置文件方式
Logback 配置(src/main/resources/logback.xml)
将配置文件打包进JAR即可生效:
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %C{1}:%L - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
占位符说明:
%d{yyyy-MM-dd HH:mm:ss}:生成无时区的本地时间戳%-5level:左对齐级别,强制占5字符宽度%C{1}:仅提取类名(去除包路径):%L:追加代码行号%msg%n:输出日志内容并换行
Log4j2 配置(src/main/resources/log4j2.xml)
若使用Log4j2,配置方式类似:
<Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %C{1}:%L - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
2. 编程式配置(Logback 示例)
通过Java代码动态配置,无需依赖外部配置文件:
import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.core.ConsoleAppender; import org.slf4j.LoggerFactory; public class LogInitializer { public static void initCustomLogging() { LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); // 初始化控制台输出Appender ConsoleAppender consoleAppender = new ConsoleAppender(); consoleAppender.setContext(context); consoleAppender.setName("CustomConsoleAppender"); // 配置格式编码器 PatternLayoutEncoder encoder = new PatternLayoutEncoder(); encoder.setContext(context); encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} %-5level %C{1}:%L - %msg%n"); encoder.start(); consoleAppender.setEncoder(encoder); consoleAppender.start(); // 绑定到根日志 Logger rootLogger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); rootLogger.addAppender(consoleAppender); rootLogger.setLevel(ch.qos.logback.classic.Level.INFO); } }
在项目启动入口(如main方法)调用LogInitializer.initCustomLogging()即可生效。
注意点
- 行号
%L会引入一定性能损耗,若对性能敏感可移除该配置 - 若项目启用代码混淆,
%C{1}可能显示混淆后的类名,可替换为%logger{1}以获得相同效果
内容的提问来源于stack exchange,提问作者Joe DiNottra
相关产品推荐
相关产品推荐

