深入理解JAVA虚拟机 PDF 深入理解JavaScript的面向对象编程
论文详细解析了Java java.util.logging.SimpleFormatter中用于自定义日志输出格式的六个索引字段(1$至6$)的含义。通过对日期、源、日志、级别、和异常堆栈等消息字段的深入剖析,并结合示例代码,指导读者如何灵活配置日志输出样式,从而为不同应用场景的日志记录需求理解SimpleFormatter。日志格式化机制
java.util.logging.simpleformatter 是 java 日志 api (jul) 中一个常用的格式化器,它允许开发者通过配置一个格式字符串来定制日志输出的样式。该格式字符串遵循 java.util.formatter 的语法,并特别定义了六个索引参数,分别对应日志记录的不同组成部分。这些索引参数的含义是理解实现精准日志格式控制的关键。
SimpleFormatter的格式字符串通常通过设置 java.util.logging.SimpleFormatter.format 例如:java.util.logging.SimpleFormatter.format="1$tc 2$sn4$s: 5$s6$sn"这个字符串定义了日志的输出布局,其中n代表换行符,而x$形式的日志位符则引用了特定的数据。核心索引字段详解
SimpleFormatter提供了六个预定义的索引索引,它们与LogRecord对象中的特定属性相对应。以下是每个字段的详细说明:
1$:Date (Date) 类型: java.util.Date 对象。含义:代表转换日志事件发生的时间。通常与 tc 格式化标志结合使用,如 1$tc,用于输出完整的日期和时间信息。对应 LogRecord 方法: getMillis() 为 Date 对象。
2$:源 (Source) 类型:字符串。含义:表示日志事件的来源。如果调用者信息可用(例如,通过 Logger.logp 或配置 LogManager LogRecord 方法: getSourceClassName() 和 getSourceMethodName() 或 getLoggerName()。
3$:日志器名称(Logger Name)
立即学习“Java学习笔记(深入)”;类型:免费字符串。意义:记录此日志消息的日志器的完整名称。回复 LogRecord 方法: getLoggerName()。
4$:日志级别(Level)类型:字符串。含义:日志消息的级别,例如“INFO”,“WARNING”,“SEVERE”等,通常是本地化的名称。对应 LogRecord 方法: getLevel().getLocalizedName()。
5$:消息(Message)OpenJobs AI
AI驱动的职位搜索推荐平台61查看详情类型:字符串。意义:经过格式化后的日志消息内容。这是通过Formatter.formatMessage(LogRecord)方法处理后的结果,它支持java.text.MessageFormat风格的参数替换。LogRecord方法:getMessage()经过Formatter处理。
6$:异常堆栈(Thrown)类型:字符串。含义:如果日志记录中关联了Throwable对象,则此字段包含异常的堆栈跟踪信息,以换行符起始符。如果没有异常,则为空字符串。对应LogRecord方法:getThrown()。示例:自定义日志输出格式
通过下面一个Java应用程序来演示如何配置SimpleFormatter的格式字符串,并观察其输出效果。
import java.io.IOException;import java.util.logging.ConsoleHandler;import java.util.logging.Level;import java.util.logging.LogManager;import java.util.logging.Logger;public class CustomLogFormatterDemo { public static void main(String[] args) { // 1.设置自定义的SimpleFormatter格式字符串 // 格式:[日期时间] [日志级别] [源] - 消息内容 (异常模块) System.setProperty(quot;java.util.logging.SimpleFormatter.formatquot;, quot;[1$tc] [4$-7s] [2$s] - 5$s6$snquot;); // 2.获取根Logger,并确保ConsoleHandler // 添加通常,默认的LogManager会配置一个ConsoleHandler Logger rootLogger = LogManager.getLogManager().getLogger(quot;quot;); rootLogger.setLevel(Level.ALL); // 设置最低日志级别以捕获所有消息 //确保ConsoleHandler使用SimpleFormatter //如果没有显式设置,默认的ConsoleHandler会使用SimpleFormatter //同时会读取java.util.logging.SimpleFormatter.format属性 boolean hasConsoleHandler = false; for (java.util.logging.Handler handler : rootLogger.getHandlers()) { if (handler instanceof ConsoleHandler) { hasConsoleHandler = true;break; } } if (!hasConsoleHandler) { ConsoleHandler ch = new ConsoleHandler(); rootLogger.addHandler(ch); } Logger logger = Logger.getLogger(CustomLogFormatterDemo.class.getName()); // 3. 记录不同类型的日志消息 logger.info(quot;这是一条普通的信息日志。
quot;); logger.warning(quot;发现一个潜在的问题,请注意。quot;); logger.fine(quot;这是一条详细的调试信息。quot;, new Object[]{quot;参数1quot;, 123}); //fine级别默认不输出,除非Handler级别如下 try { int result = 10 / 0; } catch (ArithmeticException e) { logger.log(Level.SEVERE, quot;发生严重错误:除数为零!quot;, e); } }}登录后复制
运行上述代码,你将看到类似以下的输出(日期时间会不同):[2023年10月27日下午03时30分00秒CST] [INFO ] [CustomLogFormatterDemo] - 这是一条普通的信息日志。[2023年10月27日下午03时30分00秒CST] [警告] [CustomLogFormatterDemo] - 发现潜在的问题,请注意。[2023年10月27日下午03时30分00秒CST] [SEVERE] [CustomLogFormatterDemo] - 发生严重错误:除数为零!java.lang.ArithmeticException: / by Zero at CustomLogFormatterDemo.main(CustomLogFormatterDemo.java:41)登录后复制
格式字符串解析:"[1$tc] [4$-7s] [2$s] - 5$s6$sn"1$tc:输出完整的日期和时间。4$-7s:输出日志级别(4$),左对齐(-),占用至少7个字符宽度(7),作为字符串(s)。这有助于连接不同长度的级别名称。2$s:输出日志源(通常是类名和方法名)。-:输出字面量-。5$s:输出输出后的日志消息。6$s:输出异常堆栈信息(如果存在)。n: 注意事项系统属性设置: java.util.logging.SimpleFormatter.format 属性需要在日志系统初始化设置。最常见的方式是在程序启动时通过 -D 参数传递给 JVM,或者在代码中通过 System.setProperty() 在 main 方法的早期调用。LogManager 配置:如果你在 JUL 之前使用了logging.properties 文件来配置,也可以在该文件中设置 java.util.logging.SimpleFormatter.format属性。性能考虑:获取源信息 (2$) 可能会涉及堆栈跟踪,这在性能敏感的应用中可能会带来一点头头。如果不需要精确的调用者信息,可以省略此字段。MessageFormat 与 Formatter: 5$ 消息字段本身支持 java.text.MessageFormat 风格的参数化,例如 logger.info("User {0} returned in.", "Alice");。而整个格式字符串是 java.util.Formatter 风格的。
默认行为:不设置自定义格式,SimpleFormatter 会使用其默认的格式。总结如果通过掌握 SimpleFormatter 的六个索引字段,开发者可以高度定制 Java JUL无论是为了调试、审计还是生产监控,灵活配置日志格式都是提升日志效果的重要手段。根据实际应用场景建议,选择合适的字段组合和标记,创建、简洁且丰富信息量的日志输出。
以上就是深入了解Java SimpleFormatter的日志字段的详细内容,更多请关注乐哥常识网其他文章相关! format Logging 字符串栈堆对象事件大家都在看: Java中如何写一个简单的借阅系统 Java中对象生命周期和垃圾回收机制 Java中如何实现视频播放小工具 Java中ResultSet多结果集处理与邮件批量发送教程 如何在Java中进行布尔判断
