
java.util.logging.simpleformatter 是 java 日志框架中一个常用的格式化器,它允许开发者通过配置 format 属性来定义日志输出的样式。这个 format 属性实际上遵循 java.util.formatter 的语法规则,其中 %n$ 这样的占位符用于引用日志记录中的特定数据字段。理解这些索引字段的含义是实现日志自定义的关键。
SimpleFormatter 的 format 字符串中,%n$ 形式的占位符 n 代表一个数字,从1到6,每个数字都对应 LogRecord 对象中的一个特定信息。这些字段的顺序和含义如下:
%1$:日期 (Date)
%2$:来源 (Source)
%3$:记录器名称 (Logger Name)
立即学习“Java免费学习笔记(深入)”;
%4$:日志级别 (Log Level)
%5$:日志消息 (Message)
%6$:异常信息 (Thrown)
假设我们希望日志输出格式为:[日期时间] [来源] 级别: 消息 异常堆栈,我们可以这样配置 format 属性。
示例配置:logging.properties 文件
# 默认的 ConsoleHandler 使用 SimpleFormatter java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter # 自定义 SimpleFormatter 的格式 # %1$tc: 日期时间 (完整格式) # %2$s: 来源 # %4$s: 日志级别 # %5$s: 日志消息 # %6$s: 异常信息 # %n: 换行符 java.util.logging.SimpleFormatter.format = [%1$tc] [%2$s] %4$s: %5$s%6$s%n
代码示例:在程序中设置格式
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class CustomLogFormatter {
private static final Logger logger = Logger.getLogger(CustomLogFormatter.class.getName());
public static void main(String[] args) {
// 移除默认的 ConsoleHandler,避免重复输出
Logger rootLogger = Logger.getLogger("");
for (java.util.logging.Handler handler : rootLogger.getHandlers()) {
if (handler instanceof ConsoleHandler) {
rootLogger.removeHandler(handler);
}
}
// 创建并配置自定义的 ConsoleHandler
ConsoleHandler consoleHandler = new ConsoleHandler();
// 设置 SimpleFormatter 的格式
SimpleFormatter formatter = new SimpleFormatter();
// 注意:在代码中设置格式需要通过系统属性或者自定义Formatter类
// 最直接的方式是通过logging.properties文件,或者创建一个匿名子类
// 为了演示,我们假设SimpleFormatter的format属性可以通过某种方式被设置
// 实际应用中,通常会通过logging.properties或者自定义Formatter类来实现
// 假设我们通过系统属性设置了格式 (在运行前设置 -Djava.util.logging.SimpleFormatter.format=...)
// 或者创建一个匿名SimpleFormatter子类来硬编码格式
SimpleFormatter customFormatter = new SimpleFormatter() {
private static final String FORMAT = "[%1$tc] [%2$s] %4$s: %5$s%6$s%n";
@Override
public String format(java.util.logging.LogRecord record) {
return String.format(FORMAT,
new java.util.Date(record.getMillis()), // 1$
record.getSourceClassName() != null ? record.getSourceClassName() + "." + record.getSourceMethodName() : record.getLoggerName(), // 2$
record.getLoggerName(), // 3$
record.getLevel().getLocalizedName(), // 4$
formatMessage(record), // 5$
record.getThrown() != null ? formatThrowable(record.getThrown()) : "" // 6$
);
}
private String formatThrowable(Throwable thrown) {
java.io.StringWriter sw = new java.io.StringWriter();
java.io.PrintWriter pw = new java.io.PrintWriter(sw);
pw.println(); // Add a newline before stack trace
thrown.printStackTrace(pw);
pw.close();
return sw.toString();
}
};
consoleHandler.setFormatter(customFormatter);
logger.addHandler(consoleHandler);
logger.setLevel(Level.INFO); // 设置日志级别
logger.info("这是一个普通的信息日志。");
logger.warning("发现一个警告!");
try {
throw new IOException("文件读取失败!");
} catch (IOException e) {
logger.log(Level.SEVERE, "发生严重错误", e);
}
}
}预期输出示例 (取决于日期和具体来源信息):
[2023年12月19日 下午03时30分45秒 CST] [CustomLogFormatter.main] 信息: 这是一个普通的信息日志。
[2023年12月19日 下午03时30分45秒 CST] [CustomLogFormatter.main] 警告: 发现一个警告!
[2023年12月19日 下午03时30分45秒 CST] [CustomLogFormatter.main] 严重: 发生严重错误
java.io.IOException: 文件读取失败!
at CustomLogFormatter.main(CustomLogFormatter.java:50)通过掌握 java.util.logging.SimpleFormatter 的 format 属性及其六个核心索引字段,开发者可以高度定制化 Java 日志的输出格式。无论是为了提高日志的可读性、便于问题排查,还是为了集成到特定的日志分析工具中,理解并灵活运用这些格式化选项都是一项宝贵的技能。通过配置文件或代码动态设置,可以根据项目需求轻松调整日志的呈现方式。
以上就是Java SimpleFormatter 日志格式化详解与自定义实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号