Java日志(一):Jul(java.util.logging.Logger)

本文介绍Java内置的日志记录机制,包括日志记录的基本组件、如何配置日志输出及格式,并展示了通过代码实现日志记录的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日志是任何应用程序、系统中非常重要的部分!!!
实际应用,比如接口调用需要调用日志记录,比如事件操作需要操作日志记录,比如问题报错需要错误日志记录。
合理的日志记录,使得系统的任何风吹草动都让人了如指掌,对于后续的分析排查统计完全能起到事半功倍的作用。

Java自带的log,类图大概如下:
在这里插入图片描述
如上图,Handler类负责打印日志到文件、控制台或者网络上等等,Handler类中的Formatter类负责日志格式的排版,每个Handler类实例都有自己的输出等级Level,而Logger类则负责把日志内容封装成对象,然后调用Handler类来处理这些日志对象的最终输出。
以上关系可以使用下面的代码表示:

    public static void main(String[] args) throws IOException {
        //根据名称创建一个Logger
        Logger logger = Logger.getLogger(MyLogger.class.getName());
        //创建文件Handler并设置格式Formatter和等级Level
        FileHandler fileHandler = new FileHandler("C:\\Users\\l\\Desktop\\mylog.log", true);
        fileHandler.setFormatter(new SimpleFormatter());
        fileHandler.setLevel(Level.WARNING);
        //添加到logger
        logger.addHandler(fileHandler);
        //进行日志输出
        logger.warning("warning ...");
    }

另外,可以在配置文件中指定输出类别和格式:

    public static void main(String[] args) {
        System.setProperty("java.util.logging.config.file", "mylog.properties");
        Logger logger = Logger.getLogger(MyLogger.class.getName());

        //进行日志输出
        logger.info("this is info msg...");
    }

mylog.properties:

handlers= java.util.logging.FileHandler,java.util.logging.ConsoleHandler

#.level= INFO

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = C:\\Users\\l\\Desktop\\mylog.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.level = FINE
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

创建日志logger时会自动读取配置文件java.util.logging.LogManager#readConfiguration(),并把配置文件里的参数设置进去。

<think>好的,我现在需要帮助用户理解他们提供的Java日志配置参数。用户给出的配置是: .level=INFO handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=FINE 首先,我需要确认用户对Java Util LoggingJUL)的配置是否有基本了解。用户可能是在配置日志时遇到了问题,或者想调整日志级别,但不清楚这些参数的具体作用。他们的需求可能是优化日志输出,控制不同级别的日志信息显示。 接下来,我要拆解每个配置行的含义。第行`.level=INFO`设置的是根日志记录器的级别为INFO,这意味着只有INFO及以上级别的日志会被记录。需要解释日志级别的层次结构,比如SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST,以及每个级别的用途。 第二行`handlers=java.util.logging.ConsoleHandler`指定了处理程序,这里使用的是控制台处理器,将日志输出到控制台。可能需要提到其他处理器,比如FileHandler,但用户当前配置只用了ConsoleHandler。 第三行`java.util.logging.ConsoleHandler.level=FINE`设置了ConsoleHandler的级别为FINE。这里需要解释处理器的级别和记录器级别的区别。根记录器的级别是INFO,但处理器的级别是FINE,这意味着处理器会处理FINE及以上的日志,但根记录器只允许INFO及以上级别的日志传递到处理器。因此,实际效果可能还是只有INFO及以上级别的日志被输出,因为记录器级别限制了更低级别的日志不被传递。 用户可能存在的困惑是,为什么设置了处理器的级别为FINE,但FINE级别的日志没有出现。这时候需要解释两者的关系,记录器级别优先于处理器级别。要看到FINE级别的日志,需要同时将根记录器的级别设置为FINE或更低。 另外,用户可能需要知道如何正确配置才能显示更详细的日志,比如调试信息。这时候需要给出调整根记录器级别的建议,并可能提供示例配置,说明如何同时调整记录器和处理器的级别。 还需要考虑用户是否了解配置文件的位置和加载方式。默认情况下,JUL会从JRE的lib目录下的logging.properties读取配置,但用户可能需要自定义配置文件,并通过系统属性指定。这时候可能需要指导用户如何指定自定义配置文件,例如使用`-Djava.util.logging.config.file=/path/to/your/logging.properties`。 此外,用户可能对日志级别之间的包含关系不清楚,需要明确说明每个级别的覆盖范围,以及如何组合使用记录器和处理器的级别来控制输出。 最后,可能需要给出个总结性的配置示例,帮助用户正确配置以实现他们想要的日志输出级别,并提醒常见的配置错误,比如忽略记录器级别导致处理器级别不生效的问题。</think>以下是针对你提供的 `logging.properties` 配置参数的详细解释: --- ### 、配置内容解析 ```properties .level=INFO handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=FINE ``` #### 1. `.level=INFO` - **作用**:设置根日志记录器(Root Logger)的默认日志级别为 `INFO`。 - **含义**: 只有 `INFO` 级别及更高级别的日志会被记录(即 `INFO`, `WARNING`, `SEVERE`)。 低于 `INFO` 的日志(如 `FINE`, `FINER`, `FINEST`)会被过滤掉。 #### 2. `handlers=java.util.logging.ConsoleHandler` - **作用**:指定日志处理器(Handler)的类型为控制台输出。 - **含义**: 所有日志会通过 `ConsoleHandler` 输出到控制台(System.out 或 System.err)。 可添加多个处理器(如文件处理器 `FileHandler`),用逗号分隔。 #### 3. `java.util.logging.ConsoleHandler.level=FINE` - **作用**:设置 `ConsoleHandler` 的日志级别为 `FINE`。 - **含义**: 该处理器会处理 `FINE` 级别及更高级别的日志(即 `FINE`, `INFO`, `WARNING`, `SEVERE`)。 但需注意:最终日志是否输出**取决于记录器(Logger)和处理器的双重过滤**(见下文“关键注意事项”)。 --- ### 二、关键注意事项 #### 1. **记录器(Logger)与处理器(Handler)的级别关系** - **记录器级别**(`.level=INFO`):控制哪些日志会被生成。 - 若记录器级别为 `INFO`,则 `FINE` 级别的日志根本不会生成。 - **处理器级别**(`ConsoleHandler.level=FINE`):控制哪些生成的日志会被输出。 - 若处理器级别为 `FINE`,则会输出已生成的 `FINE` 及以上级别日志。 #### 2. **配置矛盾时的实际效果** - 你的配置中: - 记录器级别为 `INFO`(过滤掉 `FINE` 日志) - 处理器级别为 `FINE`(允许输出 `FINE` 日志) - **最终结果**: 由于记录器未生成 `FINE` 日志,处理器虽然允许输出 `FINE`,但实际不会有 `FINE` 日志显示。 --- ### 三、如何输出 `FINE` 级别日志? 若希望输出 `FINE` 级别的日志(如调试信息),需同时调整**记录器级别**和**处理器级别**: ```properties # 记录器级别降低到 FINE .level=FINE # 处理器级别保持 FINE(或更低) handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=FINE ``` --- ### 四、Java Util Logging日志级别对照表 | 级别 | 数值 | 说明 | |-----------|------|-----------------------------------| | SEVERE | 1000 | 严重错误(最高级别) | | WARNING | 900 | 警告 | | INFO | 800 | 常规信息(默认级别) | | CONFIG | 700 | 配置信息 | | FINE | 500 | 般调试信息 | | FINER | 400 | 更详细的调试信息 | | FINEST | 300 | 最详细的调试信息(最低级别) | --- ### 五、常见问题 #### 1. 为什么配置了 `FINE` 但看不到调试日志? - **原因**:记录器级别(如 `.level=INFO`)高于 `FINE`,导致日志未生成。 - **解决**:将记录器级别设置为 `FINE` 或更低。 #### 2. 如何同时输出到控制台和文件? 添加 `FileHandler` 并配置: ```properties handlers=java.util.logging.ConsoleHandler, java.util.logging.FileHandler java.util.logging.FileHandler.pattern = ./logs/app.log java.util.logging.FileHandler.level = FINE ``` #### 3. 如何自定义日志格式? 通过 `ConsoleHandler.formatter` 指定格式类: ```properties java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter java.util.logging.SimpleFormatter.format = [%1$tF %1$tT] [%4$s] %5$s%6$s%n ``` --- ### 六、总结 - **记录器级别**决定生成哪些日志,**处理器级别**决定输出哪些生成的日志。 - 若需输出低级别日志(如 `FINE`),需确保两者级别均允许。 - 默认配置文件路径为 `JRE_HOME/lib/logging.properties`,可通过启动参数指定自定义配置: ```bash java -Djava.util.logging.config.file=/path/to/your/logging.properties YourApp ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值