一 简述
java.util.logging是JDK自带的日志记录包。
默认情况下,JDK的LogManager会在JRE目录下的"lib/logging.properties"这个文件中读取配置。
JDK的日志包涉及handler,formatter,level
名词 | 描述 |
handler |
将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。 常用实现类 ConsoleHandler, FileHandler, SocketHandler |
formatter | 日志信息格式化类。常用实现类 SimpleFormatter, XMLFormatter |
level |
日志记录级别。 SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值) ALL(记录所有信息) OFF(不记录任何级别信息) |
二 简单Demo
MySimpleFormatter.java
package logging.formatter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.SimpleFormatter; public class MySimpleFormatter extends SimpleFormatter{ private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private StringBuilder sb = new StringBuilder(); @Override public synchronized String format(LogRecord record) { Level level=record.getLevel(); String time=sdf.format(new Date(record.getMillis())); String loggerName=record.getLoggerName(); String message=record.getMessage(); this.sb.append("[").append(level).append("]"); this.sb.append(" ").append(time); this.sb.append(" ").append(loggerName); this.sb.append(" :").append(message); this.sb.append("\n"); return sb.toString(); } }
DefaultStreamHandler.java
package logging.handler; import java.io.OutputStream; import java.util.logging.StreamHandler; public class DefaultStreamHandler extends StreamHandler { @Override public synchronized void setOutputStream(OutputStream out) throws SecurityException { super.setOutputStream(out); } }
CustomLogManager.java
package logging.util; import java.io.IOException; import java.io.InputStream; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import logging.formatter.MySimpleFormatter; import logging.handler.DefaultStreamHandler; public class CustomLogManager{ static{ LogManager.getLogManager().reset(); // reset the log manager } // read the log configuration from outside property file public static void resetFromPropertyFile(String filePath){ LogManager logManager = LogManager.getLogManager(); InputStream inputStream = CustomLogManagerEditor.class.getClassLoader().getResourceAsStream(filePath); try { logManager.readConfiguration(inputStream); } catch (Exception e) { throw new RuntimeException("reload log configuration fail: "+e.toString()); } } public static Logger getLogger(String name){ Logger logger=Logger.getLogger(name); logger.setLevel(Level.ALL); // add console handler ConsoleHandler consoleHandler=new ConsoleHandler(); consoleHandler.setLevel(Level.FINE); consoleHandler.setFormatter(new MySimpleFormatter()); logger.addHandler(consoleHandler); // add file handler FileHandler fileHandler=null; try { fileHandler = new FileHandler("log.log",true); fileHandler.setLevel(Level.FINE); fileHandler.setFormatter(new MySimpleFormatter()); logger.addHandler(fileHandler); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // add default stream handler DefaultStreamHandler defaultStreamHandler = new DefaultStreamHandler(); defaultStreamHandler.setLevel(Level.ALL); defaultStreamHandler.setFormatter(new MySimpleFormatter()); defaultStreamHandler.setOutputStream(System.out); logger.addHandler(defaultStreamHandler); return logger; } }
logging.properties
#Level的五个等级SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值) 。这个不同于log4j #指定默认logger级别 .level= ALL #为 Handler 指定默认的级别(默认为 Level.INFO)。 java.util.logging.ConsoleHandler.level=FINE # 指定要使用的 Formatter 类的名称(默认为 java.util.logging.SimpleFormatter)。 java.util.logging.ConsoleHandler.formatter=logging.formatter.MySimpleFormatter # 为 Handler 指定默认的级别(默认为 Level.ALL)。 java.util.logging.FileHandler.level=ALL # 指定要使用的 Formatter 类的名称(默认为 java.util.logging.XMLFormatter)。 java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter # 指定要写入到任意文件的近似最大量(以字节为单位)。如果该数为 0,则没有限制(默认为无限制)。 java.util.logging.FileHandler.limit=1024000 # 指定有多少输出文件参与循环(默认为 1)。 java.util.logging.FileHandler.count=1 # 为生成的输出文件名称指定一个模式。有关细节请参见以下内容(默认为 "%h/java%u.log")。 java.util.logging.FileHandler.pattern=u.log # 指定是否应该将 FileHandler 追加到任何现有文件上(默认为 false)。 java.util.logging.FileHandler.append=true handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
测试类
Main.java
package logging; import java.io.IOException; import java.util.logging.Logger; import logging.util.CustomLogManager; public class Main { public static void main(String[] args) throws SecurityException, IOException { // CustomLogManager.resetFromPropertyFile("logging/logging.properties"); // Logger logger=Logger.getLogger(Main.class.getName()); Logger logger=CustomLogManager.getLogger(Main.class.getName()); logger.fine("warning test!"); } }
Note:
CustomLogManagerEditor.getLogger返回的logger拥有三个handler,所以记录日志信息的时候,日志信息会被存储到三个区域【log.log,System.out,System.err】。
当启用CustomLogManagerEditor.resetFromPropertyFile("logging/logging.properties");时,日志信息会被记录到控制台,以及u.log文件。
如果即调用CustomLogManagerEditor.resetFromPropertyFile("logging/logging.properties");又通过CustomLogManagerEditor.getLogger返回的logger记录日志,因为logger有5个handler,所以日志信息会被记录到4个区域【u.log,log.log,System.out,System.err】 其中在System.err中会记录2次。
相关推荐
this.jdklogger = jdklogger; } } ``` - **主要功能**:该类实现了 `Log` 接口,使用 Java SDK 提供的 `java.util.logging.Logger` 进行日志记录。 - **实现细节**: - `error` 和 `info` 方法接收 `Object`...
#### 二、JDK动态代理简介 JDK动态代理是Java平台提供的一个工具包,用于在运行时创建代理对象。它主要适用于实现了接口的情况,能够为这些接口动态生成实现类,并且可以在调用目标方法前后添加自定义的行为。JDK...
通过`Logger`、`Handler`和`Formatter`等类,开发者可以灵活地控制日志输出的级别、格式和目的地。 4. ** assert 关键字** `assert`关键字在JDK 1.4中首次引入,用于编写单元测试和调试代码,它可以检查程序内部的...
允许在 Web 应用程序部署期间启用 JDK 记录器桥接的小助手库。 请确保您了解 slf4j中描述的连接 JDK 记录器的含义。 Maven 依赖 < groupId>de.skuzzle.slf4j < artifactId>webapp-jul-to-slf4j < version>...
### Java.util.logging.Logger 使用详解 #### 一、创建Logger对象 在Java中,`java.util.logging.Logger` 是标准的日志框架之一,它提供了基础的日志记录功能。为了使用这一功能,首先需要获得 `java.util.logging...
日志配置通常在`logging.properties`文件中进行,这是一个位于JDK安装目录下的`jre/lib/logging.properties`文件。在这个文件中,你可以定义日志处理器(handler),例如`ConsoleHandler`将日志输出到控制台,`...
每个类都可以拥有自己的`Logger`实例,通过`Logger.getLogger()`方法获取,如`Logger logger = Logger.getLogger(MyClass.class.getName());`。`Logger`对象提供了多个级别供选择,包括`SEVERE`、`WARNING`、`INFO`...
JDK内置的日志框架——java.util.logging(也称为 JUL)虽然简单易用,但在功能和灵活性上可能无法满足复杂的企业级需求。本文将深入探讨如何对JDK的日志进行扩展,以提升日志系统的效能和定制性。 首先,我们需要...
* JdkLoggerUtils是基于JDK Logger对日志进行输出存储的工具类, * 封装了日志输出的的各种方法,本类模仿了log4j的输出格式,定义 * 了1、日志输出到控制台,2、日志输出到文件,3、日志发送邮件, * 4、日志...
5. **Logging API**:引入了java.util.logging.Logger类,提供了灵活的日志记录框架,方便开发者根据需要调整日志级别和输出方式。 6. **反射API改进**:JDK 1.4对反射API进行了增强,如Method的invoke方法可以处理...
10. **日志框架:**JDK7提供了**`java.util.logging.Logger`**的日志API,允许开发者轻松地控制应用程序的输出日志级别。 通过深入学习和理解JDK7 API中文文档,开发者能够更好地利用Java 7的特性进行高效编程,...
7. **日志框架改进**:JDK 1.6提供了java.util.logging.Logger,一个轻量级的日志框架,便于开发人员记录应用程序的运行日志。 8. **脚本引擎支持**:通过ScriptEngine接口,JDK 1.6支持JavaScript、Groovy等脚本...
8. **改进的日志框架**:引入了`java.util.logging.Logger`,提供了更灵活的日志记录功能,可以方便地配置日志级别和处理器。 9. **脚本语言支持**:JDK1.6通过JSR 223添加了对多种脚本语言的支持,如JavaScript,...
在JDK的`java.util.logging`框架中,`Logger`类是核心,它负责生成日志消息。每个应用程序模块通常都有一个与之关联的`Logger`实例,通过`Logger.getLogger()`方法获取。`Handler`类处理日志消息,如将它们写入文件...
#### 一、Apache Commons Logging与log4j及JDK Logger的关系 **Apache Commons Logging** 的设计初衷是为了提供一个简洁统一的日志接口,它并不直接实现日志功能,而是通过桥接的方式支持多种底层日志框架。这种...
SLF4J的"jdk14"模块是特别针对Java 1.4引入的,因为Java 1.4及更早版本中包含了一个简单的日志API,即java.util.logging(JUL)。SLF4J.jdk14-1.6.1.jar是SLF4J的一个绑定包,它提供了与Java内置的日志系统(JUL)的...
用于log4j和jdk的颜色控制台日志记录 用法 从下载最新的颜色记录器jar或自行构建 下载可选,请参见下文( jansi-1.18是此时的最新版本,但我没什么花哨的东西,所以我不希望其他版本感到惊讶) 确保上面提到的jar...
Java日志框架,尤其是`java.util.logging`包,是JDK1.4引入的一个强大工具,旨在替代传统的`System.out.println()`方式,提供更高效、更灵活的日志管理和记录功能。这个框架允许开发者创建和管理日志记录,方便对...