`

JDK Logger 简介

    博客分类:
  • jdk
阅读更多

一 简述

java.util.logging是JDK自带的日志记录包。

默认情况下,JDK的LogManager会在JRE目录下的"lib/logging.properties"这个文件中读取配置。

JDK的日志包涉及handler,formatter,level

名词 描述
handler

将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。

常用实现类 ConsoleHandlerFileHandlerSocketHandler

formatter 日志信息格式化类。常用实现类 SimpleFormatterXMLFormatter
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次。

 

 

 

 

分享到:
评论
5 楼 lijiejava 2013-08-19  
antlove 写道
lijiejava 写道
我同事被查出胃癌,唉,大家要注意身体啊 
我了个去

4 楼 antlove 2013-08-19  
lijiejava 写道
我同事被查出胃癌,唉,大家要注意身体啊 
我了个去
3 楼 lijiejava 2013-08-17  
我同事被查出胃癌,唉,大家要注意身体啊 
2 楼 antlove 2013-08-16  
lijiejava 写道
好!!!
鼓掌!!!
狂喊!!!
使劲!!!

1 楼 lijiejava 2013-08-15  
好!!!
鼓掌!!!
狂喊!!!
使劲!!!

相关推荐

    Apache Common Log 设计方案

    this.jdklogger = jdklogger; } } ``` - **主要功能**:该类实现了 `Log` 接口,使用 Java SDK 提供的 `java.util.logging.Logger` 进行日志记录。 - **实现细节**: - `error` 和 `info` 方法接收 `Object`...

    java.util.logging.Logger使用详解

    ### Java.util.logging.Logger 使用详解 #### 一、创建Logger对象 在Java中,`java.util.logging.Logger` 是标准的日志框架之一,它提供了基础的日志记录功能。为了使用这一功能,首先需要获得 `java.util.logging...

    JDK动态代理_JDK动态代理

    #### 二、JDK动态代理简介 JDK动态代理是Java平台提供的一个工具包,用于在运行时创建代理对象。它主要适用于实现了接口的情况,能够为这些接口动态生成实现类,并且可以在调用目标方法前后添加自定义的行为。JDK...

    JDK1.4.2官方英文API

    通过`Logger`、`Handler`和`Formatter`等类,开发者可以灵活地控制日志输出的级别、格式和目的地。 4. ** assert 关键字** `assert`关键字在JDK 1.4中首次引入,用于编写单元测试和调试代码,它可以检查程序内部的...

    webapp-jul-to-slf4j:用于 Web 应用程序的 JDK Logger 桥接

    允许在 Web 应用程序部署期间启用 JDK 记录器桥接的小助手库。 请确保您了解 slf4j中描述的连接 JDK 记录器的含义。 Maven 依赖 < groupId>de.skuzzle.slf4j < artifactId>webapp-jul-to-slf4j < version>...

    java swing用Logger输出错误日志.docx

    日志配置通常在`logging.properties`文件中进行,这是一个位于JDK安装目录下的`jre/lib/logging.properties`文件。在这个文件中,你可以定义日志处理器(handler),例如`ConsoleHandler`将日志输出到控制台,`...

    JDK自带的日志包简单应用

    每个类都可以拥有自己的`Logger`实例,通过`Logger.getLogger()`方法获取,如`Logger logger = Logger.getLogger(MyClass.class.getName());`。`Logger`对象提供了多个级别供选择,包括`SEVERE`、`WARNING`、`INFO`...

    对JDK log日志的扩展

    JDK内置的日志框架——java.util.logging(也称为 JUL)虽然简单易用,但在功能和灵活性上可能无法满足复杂的企业级需求。本文将深入探讨如何对JDK的日志进行扩展,以提升日志系统的效能和定制性。 首先,我们需要...

    JdkLoggerUtils.java

    * JdkLoggerUtils是基于JDK Logger对日志进行输出存储的工具类, * 封装了日志输出的的各种方法,本类模仿了log4j的输出格式,定义 * 了1、日志输出到控制台,2、日志输出到文件,3、日志发送邮件, * 4、日志...

    这是jdk1.4

    5. **Logging API**:引入了java.util.logging.Logger类,提供了灵活的日志记录框架,方便开发者根据需要调整日志级别和输出方式。 6. **反射API改进**:JDK 1.4对反射API进行了增强,如Method的invoke方法可以处理...

    JDK7 API 中文 文档.CHM

    10. **日志框架:**JDK7提供了**`java.util.logging.Logger`**的日志API,允许开发者轻松地控制应用程序的输出日志级别。 通过深入学习和理解JDK7 API中文文档,开发者能够更好地利用Java 7的特性进行高效编程,...

    jdk 1.6 带索引 api

    7. **日志框架改进**:JDK 1.6提供了java.util.logging.Logger,一个轻量级的日志框架,便于开发人员记录应用程序的运行日志。 8. **脚本引擎支持**:通过ScriptEngine接口,JDK 1.6支持JavaScript、Groovy等脚本...

    Java JDK1.6

    8. **改进的日志框架**:引入了`java.util.logging.Logger`,提供了更灵活的日志记录功能,可以方便地配置日志级别和处理器。 9. **脚本语言支持**:JDK1.6通过JSR 223添加了对多种脚本语言的支持,如JavaScript,...

    采用jdk实现的日志框架

    在JDK的`java.util.logging`框架中,`Logger`类是核心,它负责生成日志消息。每个应用程序模块通常都有一个与之关联的`Logger`实例,通过`Logger.getLogger()`方法获取。`Handler`类处理日志消息,如将它们写入文件...

    log4J学习笔记

    #### 一、Apache Commons Logging与log4j及JDK Logger的关系 **Apache Commons Logging** 的设计初衷是为了提供一个简洁统一的日志接口,它并不直接实现日志功能,而是通过桥接的方式支持多种底层日志框架。这种...

    slf4j.jdk14-1.6.1.jar

    SLF4J的"jdk14"模块是特别针对Java 1.4引入的,因为Java 1.4及更早版本中包含了一个简单的日志API,即java.util.logging(JUL)。SLF4J.jdk14-1.6.1.jar是SLF4J的一个绑定包,它提供了与Java内置的日志系统(JUL)的...

    java-color-loggers:用于log4j和jdk的颜色控制台日志记录

    用于log4j和jdk的颜色控制台日志记录 用法 从下载最新的颜色记录器jar或自行构建 下载可选,请参见下文( jansi-1.18是此时的最新版本,但我没什么花哨的东西,所以我不希望其他版本感到惊讶) 确保上面提到的jar...

    java_logger知识

    Java日志框架,尤其是`java.util.logging`包,是JDK1.4引入的一个强大工具,旨在替代传统的`System.out.println()`方式,提供更高效、更灵活的日志管理和记录功能。这个框架允许开发者创建和管理日志记录,方便对...

Global site tag (gtag.js) - Google Analytics