Java中自带的Logger使用

原创 2016年05月31日 17:02:39


在Java中,自带了一个 java.util.logging.Logger, 由于有log4j的存在,这个再带的logger貌似使用比较少。下面就简单接收一下,这个logger的使用方法。


首先看代码, 定义一个 LogUtil 用来返回一个自定义的log

class LogUtil {
	public static Logger getLogger() {
		System.setProperty("java.util.logging.config.file", "mylog.properties");
		Logger log = Logger.getLogger("myLogger");
		log.setLevel(Level.ALL);
		return log;
	}

}

上面代码中 mylog.properties 是自定义log的配置文件,使用的相对路径,放到工作目录,也就是 System.getProperty("user.dir") 目录下;当然也可以使用绝对路径,可以放到任意目录下。 把这个文件,作为系统属性,设置给 
java.util.logging.config.file

当然,也可在命令行指定这个属性 java -Djava.util.logging.config.file  mylog.properties XXXClass


mylog.properties 配置内容如下:

myLogger.handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
myLogger.level= ALL
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tc][%2$s]: %4$s: %5$s%6$s%n


java.util.logging.FileHandler.pattern = C:\\Users\\myname\\myworkspace\\Demo\\mylog-%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.level = FINE
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

这里配置了一个 名字叫 myLogger 的logger,给它指定的2个handlers, 并把myLogger.level 设置为ALL。

myLogger.handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
myLogger.level= ALL

ConsoleHandler 是把log输出到 控制台,FileHandler 是把log输出到文件。

每个Handler又可以定义自己的 level。log level的基本如下:

SEVERE (highest value) 
WARNING 
INFO 
CONFIG 
FINE 
FINER 
FINEST (lowest value) 

另外还有两个值, Level.OFF 和 Level.ALL

myLogger.level 是总开关,如果myLogger.level设置为  OFF, 它handler无论设置什么值,都不会有输出。 如果myLogger.level设置为 FINE, 只有FINE 以上的log才会输出,即使Handler 把Level是指为ALL。


上面配置中,ConsoleHandler 使用了单行文本输出,FileHandler 使用了XML作为输出。


在ConsoleHandler 中, log输出采用 java.util.logging.SimpleFormatter  类格式化,实际是是调用如下方法格式化的。

 String.format(format, date, source, logger, level, message, thrown);

格式化表达式中:

%1$ 代表 date,%2$ 代表 source, 以此类推,每一个%n$ 分别代表 String.format(....) 的一个参数。

例如:

java.util.logging.SimpleFormatter.format=[%1$tc][%2$s]: %4$s: %5$s%6$s%n

输出的log信息类似下面的字符串
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: Info: Hellow World!

在上面 FileHandler 中, 输出log文件名为

java.util.logging.FileHandler.pattern = C:\\Users\\myname\\myworkspace\\Demo\\mylog-%u.log
在定义log文件时候,可以使用如下特殊标记

"/" the local pathname separator 
"%t" the system temporary directory 
"%h" the value of the "user.home" system property 
"%g" the generation number to distinguish rotated logs 
"%u" a unique number to resolve conflicts 
"%%" translates to a single percent sign "%" 


这里FileHandler  我们定义为 XMLFormatter, 我们完全可以把它给成和 ConsoleHandler  一样, 定义成 SimpleFormatter。


现在来看客户端如何使用我们自定义的Logger, 代码如下:

public class LogDemo {

	public static void main(String[] args) {
		Logger log1 = LogUtil.getLogger();
		Logger log2 = LogUtil.getLogger();
		System.out.println(log1 == log2 ? "log1 = log2" : "log1 != log2");
		LogDemo.testLog(log1);

	}

	private static void testLog(Logger log) {
		System.out.println("Log:" + log.getName());
		log.info("Info: Hellow World!");
		log.warning("warning: Hellow World!");
		log.info("logname = " + log.getName());
		log.info("handlers = " + log.getHandlers().length);

		for (Handler h : log.getHandlers()) {
			log.info(h.getClass() + " " + h.getLevel());

		}
		log.fine("Log Fine");
	}

}


运行后输出:

log1 = log2
Log:myLogger
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: Info: Hellow World!
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: WARNING: warning: Hellow World!
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: logname = myLogger
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: handlers = 2
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: class java.util.logging.ConsoleHandler ALL
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: class java.util.logging.FileHandler FINE
[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: FINE: Log Fine


在我们的客户端程序中, 连续调用了两次 getLogger()

		Logger log1 = LogUtil.getLogger();
		Logger log2 = LogUtil.getLogger();
从输出可以看出,它们返回的是同一个对象

log1 = log2

所以对于名字为“myLogger” 这个logger实例, 它是一个单例。虚拟机只会创建一个名字为 “myLogger”的logger 对象。



下面是 FileHandler 输出到文件中的内容

C:\Users\myname\myworkspace\Demo\mylog-0.log

<?xml version="1.0" encoding="GBK" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569941</millis>
  <sequence>0</sequence>
  <logger>myLogger</logger>
  <level>INFO</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>Info: Hellow World!</message>
</record>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569943</millis>
  <sequence>1</sequence>
  <logger>myLogger</logger>
  <level>WARNING</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>warning: Hellow World!</message>
</record>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569943</millis>
  <sequence>2</sequence>
  <logger>myLogger</logger>
  <level>INFO</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>logname = myLogger</message>
</record>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569944</millis>
  <sequence>3</sequence>
  <logger>myLogger</logger>
  <level>INFO</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>handlers = 2</message>
</record>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569944</millis>
  <sequence>4</sequence>
  <logger>myLogger</logger>
  <level>INFO</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>class java.util.logging.ConsoleHandler ALL</message>
</record>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569945</millis>
  <sequence>5</sequence>
  <logger>myLogger</logger>
  <level>INFO</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>class java.util.logging.FileHandler FINE</message>
</record>
<record>
  <date>2016-05-31T17:56:09</date>
  <millis>1464688569946</millis>
  <sequence>6</sequence>
  <logger>myLogger</logger>
  <level>FINE</level>
  <class>log.LogDemo</class>
  <method>testLog</method>
  <thread>1</thread>
  <message>Log Fine</message>
</record>
</log>


 









版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java Logger 的使用与配置

Logger所对应的属性文件在安装jdk目录下的jre/lib/logging.properties  (比如在我当前的机子里是C:\Program Files\Java\jre6\lib\loggi...
  • nash603
  • nash603
  • 2011年09月05日 15:29
  • 12802

java.util.logging.Logger使用详解

java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着,其实在一些测试性的代码中,jdk自带的logger比log4j更...
  • QH_JAVA
  • QH_JAVA
  • 2015年06月28日 11:53
  • 10874

java.util.logging.Logger的使用总结

一直用的是Log4j记录日志信息,突然发现很多人在用Logger,就总结了下,希望这篇文章对大家学习Logger有用。 首先是创建Logger对象: static Logger getLogg...

java中Logger的一些理解

今天看项目代码,发现一个Logger的用法,包含在util包里面。 所以就是java.util.logging.Logger; Logger的四个级别分别是: SEVERE(最高值)WARN...

java Logger 的使用与配置2

Java Logging API是sun公司于2002年5月正式发布的。它是自J2SE 1.4版本开始提供的一个新的应用程序接口。它能够很方便地控制和输出日志信息到文件,控制台或其它用户定义的地方,如...
  • nash603
  • nash603
  • 2011年09月05日 15:42
  • 5266

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Java打log日志

最近写Java工程,需要在客户端打上log,以便进行出错追踪。刚开始试了一些log4j之类的包,想着功能强大点儿。但是由于配置、版本不兼容、傻叉Windows等一系列问题,最终放弃,干脆直接采用Jav...

Java开发常用工具类

package com.cucpay.tradeportal.util; import java.io.UnsupportedEncodingException; import java...

Java Logger 介绍

一个使用java.util.logging.Logger进行log输出的示例代码如下:package com.sample; import java.io.File; import java....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中自带的Logger使用
举报原因:
原因补充:

(最多只允许输入30个字)