Java自带日志工具java.util.logging.Logger

java.util.logging.Logger是JDK自带的日志工具类,从1.4版本开始就已经有了。由于log4j等开源的日志组件,这个Logger并没有太多展现机会。但在一些测试性的代码中,JDK自带的Logger比log4j等更方便。

创建Logger对象

要使用JDK的日志功能,首先要取得java.util.logging.Logger实例,这可以通过Logger类的两个静态getLogger()方法来取得:

static Logger getLogger(String name) 
        查找或创建一个logger。
static Logger getLogger(String name, String resourceBundleName)
        为指定子系统查找或创建一个logger。

name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个。

Logger的日志级别

全部定义在java.util.logging.Level里面。
各级别按降序排列如下:

  • SEVERE(最高值)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST(最低值)

此外,还有一个级别 OFF,可用来关闭日志记录。

使用级别 ALL 启用所有消息的日志记录。

Logger默认的级别是INFO,比INFO更低的日志将不显示。

比如下面这段代码:

package com.peterwanghao.samples.java.utils.java;

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

public class LoggingDemo {
	public static void main(String[] args){
        Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");
        
        myLogger.log(Level.SEVERE, "严重信息");
        myLogger.log(Level.WARNING, "警告信息");
        myLogger.log(Level.INFO, "一般信息");
        myLogger.log(Level.CONFIG, "设定方面的信息");
        myLogger.log(Level.FINE, "细微的信息");
        myLogger.log(Level.FINER, "更细微的信息");
        myLogger.log(Level.FINEST, "最细微的信息");
    }
}

它的执行结果如下,只看到3条日志信息:
默认日志级别

Logger的默认级别定义是在jre安装目录的lib下面logging.properties文件中。

# 缺省的全局级别.
.level= INFO

# 控制台级别
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

如果将控制台级别设置为ALL:

java.util.logging.ConsoleHandler.level = ALL

同时降低创建的Logger实例级别则可以显示出想要的内容:

package com.peterwanghao.samples.java.utils.java;

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

public class LoggingDemo {
	public static void main(String[] args){
        Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");

        myLogger.setLevel(Level.ALL);//设置级别为ALL,显示全部日志
        
        myLogger.log(Level.SEVERE, "严重信息");
        myLogger.log(Level.WARNING, "警告信息");
        myLogger.log(Level.INFO, "一般信息");
        myLogger.log(Level.CONFIG, "设定方面的信息");
        myLogger.log(Level.FINE, "细微的信息");
        myLogger.log(Level.FINER, "更细微的信息");
        myLogger.log(Level.FINEST, "最细微的信息");
    }
}

执行结果如下:
全部日志级别

输出媒介控制器Handler

如果不想修改系统配置文件logging.properties,可以自己创建ConsolerHandler,也就是将信息输出至控制台。在自建的ConsolerHandler中调整日志级别。

package com.peterwanghao.samples.java.utils.java;

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

public class LoggingDemo {
	public static void main(String[] args){
        Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");

        myLogger.setLevel(Level.ALL);
        
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        myLogger.addHandler(consoleHandler);
        
        myLogger.log(Level.SEVERE, "严重信息");
        myLogger.log(Level.WARNING, "警告信息");
        myLogger.log(Level.INFO, "一般信息");
        myLogger.log(Level.CONFIG, "设定方面的信息");
        myLogger.log(Level.FINE, "细微的信息");
        myLogger.log(Level.FINER, "更细微的信息");
        myLogger.log(Level.FINEST, "最细微的信息");
    }
}

执行效果跟上面一样。

日志信息除了输出到控制台外,还可以写到日志文件里,使用java.util.logging.FileHandler 将信息输出到文件。

package com.peterwanghao.samples.java.utils.java;

import java.io.File;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LoggingDemo {
	public static void main(String[] args){
        Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");

        myLogger.setLevel(Level.ALL);
        
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        myLogger.addHandler(consoleHandler);
        
        FileHandler fileHandler = null;
        try {
			String filePath = "E:\\" + File.separator + "logs";
			String logPath = "LoggingDemo.log";
			File fi = new File(filePath);
			if ((fi.exists()) && (fi.isDirectory())) {
				logPath = filePath + File.separator + logPath;
			} else if (!fi.exists()) {
				try {
					fi.mkdirs();
					logPath = filePath + File.separator + logPath;
				} catch (Exception localException) {
				}
			}
			fileHandler = new FileHandler(logPath, true);//true表示日志内容在文件中追加
			fileHandler.setLevel(Level.ALL);//级别为ALL,记录所有消息
			
			myLogger.addHandler(fileHandler);
			
		} catch (Throwable e) {
			System.out.println("创建文件失败!" + e.getMessage());
		}
        
        myLogger.log(Level.SEVERE, "严重信息");
        myLogger.log(Level.WARNING, "警告信息");
        myLogger.log(Level.INFO, "一般信息");
        myLogger.log(Level.CONFIG, "设定方面的信息");
        myLogger.log(Level.FINE, "细微的信息");
        myLogger.log(Level.FINER, "更细微的信息");
        myLogger.log(Level.FINEST, "最细微的信息");
    }
}

执行后会自动生成日志文件,内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2021-12-24T17:52:38</date>
  <millis>1640339558986</millis>
  <sequence>0</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>SEVERE</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>严重信息</message>
</record>
<record>
  <date>2021-12-24T17:52:39</date>
  <millis>1640339559068</millis>
  <sequence>1</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>WARNING</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>警告信息</message>
</record>
<record>
  <date>2021-12-24T17:52:39</date>
  <millis>1640339559074</millis>
  <sequence>2</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>INFO</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>一般信息</message>
</record>
<record>
  <date>2021-12-24T17:52:39</date>
  <millis>1640339559076</millis>
  <sequence>3</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>CONFIG</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>设定方面的信息</message>
</record>
<record>
  <date>2021-12-24T17:52:39</date>
  <millis>1640339559078</millis>
  <sequence>4</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>FINE</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>细微的信息</message>
</record>
<record>
  <date>2021-12-24T17:52:39</date>
  <millis>1640339559079</millis>
  <sequence>5</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>FINER</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>更细微的信息</message>
</record>
<record>
  <date>2021-12-24T17:52:39</date>
  <millis>1640339559080</millis>
  <sequence>6</sequence>
  <logger>com.peterwanghao.LoggingDemo</logger>
  <level>FINEST</level>
  <class>com.peterwanghao.samples.java.utils.java.LoggingDemo</class>
  <method>main</method>
  <thread>1</thread>
  <message>最细微的信息</message>
</record>
</log>

不同的处理器可以设置不同的日志级别,接收不同的日志信息。

自定义Formatter

Formatter可以为日志信息做格式化处理。Formatter接受LogRecord,并将它转换为一个特定格式字符串。

默认提供了两种Formatter:
1.java.util.logging.SimpleFormatter:标准日志格式。

2.java.util.logging.XMLFormatter:XML形式的日志格式。

从上一节的例子可知,FileHandler的默认格式是java.util.logging.XMLFormatter,而ConsolerHandler的默认格式是java.util.logging.SimpleFormatter。

可自己设计想要的日志格式:

package com.peterwanghao.samples.java.utils.java;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LoggingDemo {
	public static void main(String[] args){
        Logger myLogger = Logger.getLogger("com.peterwanghao.LoggingDemo");

        myLogger.setLevel(Level.ALL);
        
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        myLogger.addHandler(consoleHandler);
        
        FileHandler fileHandler = null;
        try {
			String filePath = "E:\\" + File.separator + "logs";
			String logPath = "LoggingDemo.log";
			File fi = new File(filePath);
			if ((fi.exists()) && (fi.isDirectory())) {
				logPath = filePath + File.separator + logPath;
			} else if (!fi.exists()) {
				try {
					fi.mkdirs();
					logPath = filePath + File.separator + logPath;
				} catch (Exception localException) {
				}
			}
			fileHandler = new FileHandler(logPath, true);//true表示日志内容在文件中追加
			fileHandler.setLevel(Level.ALL);//级别为ALL,记录所有消息
			fileHandler.setFormatter(new Formatter() {
				private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

				public String format(LogRecord record) {
					StringBuilder sb = new StringBuilder();
					String dataFormat = this.sdf.format(Long.valueOf(record.getMillis()));
					sb.append(dataFormat).append(" ");
					sb.append("level:").append(record.getLevel()).append(" ");
					sb.append(record.getMessage()).append("\n");

					return sb.toString();
				}
			});
			myLogger.addHandler(fileHandler);
			
		} catch (Throwable e) {
			System.out.println("创建文件失败!" + e.getMessage());
		}
        
        myLogger.log(Level.SEVERE, "严重信息");
        myLogger.log(Level.WARNING, "警告信息");
        myLogger.log(Level.INFO, "一般信息");
        myLogger.log(Level.CONFIG, "设定方面的信息");
        myLogger.log(Level.FINE, "细微的信息");
        myLogger.log(Level.FINER, "更细微的信息");
        myLogger.log(Level.FINEST, "最细微的信息");
    }
}

执行效果如下:

2021-12-24 18:13:44 level:SEVERE 严重信息
2021-12-24 18:13:44 level:WARNING 警告信息
2021-12-24 18:13:44 level:INFO 一般信息
2021-12-24 18:13:44 level:CONFIG 设定方面的信息
2021-12-24 18:13:44 level:FINE 细微的信息
2021-12-24 18:13:44 level:FINER 更细微的信息
2021-12-24 18:13:44 level:FINEST 最细微的信息
  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peterwanghao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值