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
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
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
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
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
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
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
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
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
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
2
但是在Windows的终端里,就可以这样执行,待解决
# 小结
本文简单介绍了下Java自带的日志类,意在让读者有个基本的认知,后面会介绍Log4j
# 参考
在 GitHub 上编辑此页 (opens new window)
上次更新: 2024/3/26 00:57:05