从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE
  • JavaWeb
  • Spring
  • 主流框架
  • 学习网课的心得
  • 输入法
职场系列
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE
  • JavaWeb
  • Spring
  • 主流框架
  • 学习网课的心得
  • 输入法
职场系列
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE概念

    • Ant

    • 日志

      • 日志介绍
      • print大法
      • 常见的日志框架-简单介绍
      • 一个日志框架的设计
      • JDK Logging
        • logging入门
        • 打印异常
        • 使用默认配置文件
        • 指定配置文件
        • 小结
        • 参考
      • log4j2 笔记
      • 日志的一些小技巧
      • 日志系统小结
    • Junit

    • JDBC

    • XML和JSON

    • Java
  • JavaWeb

  • Spring

  • 主流框架

  • 韩顺平

  • Java
  • Java
  • JavaEE
  • 日志
2022-12-03
目录

JDK Logging

# 04.JDK Logging

‍

在Java1.4,Java标准库内部就提供了这个工具类, java.util.logging​

# logging入门

我们先看一个简单的例子

import java.util.logging.Level;
import java.util.logging.Logger;

public class HelloJDKLogging {
  public static void main(String[] args) {
    Logger logger = Logger.getGlobal();
    logger.info("start process.....");  
    logger.warning("waring! memorey is running out");
    logger.fine("new program is runing well... please ignored");
    logger.severe("process will be terminated....");
  }
}

1
2
3
4
5
6
7
8
9
10
11
12
13

‍

输出如下:

> java HelloJDKLogging
十一月 29, 2022 9:02:52 下午 HelloJDKLogging main
信息: start process.....
十一月 29, 2022 9:02:52 下午 HelloJDKLogging main
警告: waring! memorey is running out
十一月 29, 2022 9:02:52 下午 HelloJDKLogging main
严重: process will be terminated....
1
2
3
4
5
6
7

可以看到,虽然我们没设置输出打印的时间,调用类和执行方法是什么,但都自动打印了。为什么logger.fine()​没有打印?因为fine的级别比较低。日志的输出可以设定级别。JDK的Logging定义了7个日志级别,从严重到普通:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

默认是INFO级别,INFO级别以下的就不会打印了。通过调整级别,可以在系统运行稳定的时候只打印错误级别的日志,减少日志量。

‍

‍

# 打印异常

既然是记日志,肯定得试着打印异常了,我们练习下:

import java.util.logging.Logger;
public class JDKLoggingException {
  public static void main(String[] args) {
    Logger logger = Logger.getGlobal();

    try {
      int n = 1 / 0;
    } catch (Exception e) {
      // TODO: handle exception
      logger.severe(e.toString());
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

‍

结果:

> javac .\JDKLoggingException.java
> java JDKLoggingException    
十一月 29, 2022 9:24:45 下午 JDKLoggingException main
严重: java.lang.ArithmeticException: / by zero
1
2
3
4

‍

# 使用默认配置文件

前面我们说过,JDK logging的默认打印级别的INFO,这个默认配置是在哪的呢?我们能不能修改呢?可以的。

默认的配置文件在$JAVA_HOME$/jre/lib/logging.properties​,我们可以打开它,可以看到第43行是打印级别:

java.util.logging.ConsoleHandler.level = INFO
1

我们尝试修改下这个打印级别为fine:

java.util.logging.ConsoleHandler.level = FINE
1

我们还需在该文件默认,添加包的日志级别:

com.peterjxl.logging.level = FINE
1

‍

我们编写代码:

package com.peterjxl.logging;

import java.util.logging.Level;
import java.util.logging.Logger;

public class HelloJDKLogging2Default {

  private static Logger logger = Logger.getLogger("com.peterjxl.logging");

  public static void main(String[] args) {
    logger.info("start process.....");   
    logger.warning("waring! memorey is running out");
    logger.fine("new program is runing well... please ignored");
    logger.severe("process will be terminated....");
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

‍

然后编译和运行

> javac -d . HelloJDKLogging2Default.java      
> java com.peterjxl.logging.HelloJDKLogging2Default  
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
信息: start process.....
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
警告: waring! memorey is running out
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
详细: new program is runing well... please ignored
十二月 03, 2022 10:32:57 上午 com.peterjxl.logging.HelloJDKLogging2Default main
严重: process will be terminated....
1
2
3
4
5
6
7
8
9
10

可以看到logger.fine​确实有执行

‍

‍

# 指定配置文件

一般来说,不用动到默认的配置文件,因为这个配置文件是公用的,一动可能会影响到其他项目的使用。我们先将JVM自带的配置文件还原。

所以,一般是指定一个配置文件,然后在项目启动的时候指定配置文件。

新建配置文件logging.properties:

handlers= java.util.logging.FileHandler,java.util.logging.ConsoleHandler
.level= FINE
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter =java.util.logging.XMLFormatter
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter =java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = %1$tF %1$tH:%1$tM:%1$tS,%1$tL %4$s %2$s %5$s %n
1
2
3
4
5
6
7
8
9

‍

‍

编译和运行,在JVM启动的时候指定配置文件

>java -Djava.util.logging.config.file=logging.properties HelloJDKLogging
2022-12-03 11:40:16,915 信息 HelloJDKLogging main start process.....
2022-12-03 11:40:16,973 警告 HelloJDKLogging main waring! memorey is running out
2022-12-03 11:40:16,974 严重 HelloJDKLogging main process will be terminated....
1
2
3
4

‍

‍

可以看到和之前的输出不同:

>java HelloJDKLogging
十二月 03, 2022 11:42:52 上午 HelloJDKLogging main
信息: start process.....
十二月 03, 2022 11:42:52 上午 HelloJDKLogging main
警告: waring! memorey is running out
十二月 03, 2022 11:42:52 上午 HelloJDKLogging main
严重: process will be terminated....
1
2
3
4
5
6
7

‍

关于最后一行的说明:

java.util.logging.SimpleFormatter.format=%1$tF %1$tH:%1$tM:%1$tS,%1$tL %4$s %2$s %5$s %n
1

‍

  • 1$ 日期时间
    tF 日期(YYYY-MM-DD)
    tH 小时
    tM 分钟
    tS 秒
    tL 毫秒
  • 2$ 输出日志的类名和方法名
  • 3$ Logger's name. 即getLogger(name) 中的name
  • 4$ log level
  • 5$ 输出内容

‍

注意:在VSCode的终端里运行的时候,一直报错:

java -Djava.util.logging.config.file = logging.properties HelloJDKLogging
错误: 找不到或无法加载主类 .util.logging.config.file
1
2

但是在Windows的终端里,就可以这样执行,待解决

‍

‍

# 小结

本文简单介绍了下Java自带的日志类,意在让读者有个基本的认知,后面会介绍Log4j

‍

‍

# 参考

使用JDK Logging - 廖雪峰的官方网站 (opens new window)

java底层JDK Logging日志模块处理细节深入分析_java_脚本之家 (opens new window)

在GitHub上编辑此页 (opens new window)
上次更新: 2023/1/25 11:04:26
一个日志框架的设计
log4j2 笔记

← 一个日志框架的设计 log4j2 笔记→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式