Logger管理日志

java.util.logging.Logger使用详解

一、创建Logger对象

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

  查找或创建一个logger。
  static Logger getLogger(String name) 

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

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

下面是简单范例:

  import java.util.logging.*;
  public class LoggingDemo {
    public static void main(String[] args) {
          Logger logger = Logger.getLogger("!LoggingDemo");
          try {
                System.out.println(args![0]);
          } catch(!ArrayIndexOutOfBoundsException e) {
                logger.warning("没有提供执行时的自变量!");
          }                
    }
  }

  执行结果: 
  2009-4-7 15:41:43 pku.sei.LoggingDemo main
  警告:没有提供执行时的自变量! 

二、日志级别

在进行信息的记录时,依信息程序的不同,会设定不同等级的信息输出。Java log比log4j的级别详细,全部定义在java.util.logging.Level里面。

各级别按降序排列如下:

  • SEVERE(最高值) 严重信息
  • WARNING 警示信息
  • INFO 一般信息
  • CONFIG 配置信息
  • FINE 细微信息
  • FINER 更细微的信息
  • FINEST(最低值) 最细微的信息

可以通过操作Logger上的几个方法来得到不同等级的信息输出。如下列范例:

  import java.util.logging.*;
  public class LoggingLevelDemo{
           public static void main(String[] args){
                     Logger logger = Logger.getLogger("loggingLevelDemo");
                     logger.severe("严重信息");
                     logger.warning("警示信息");
                     logger.info("一般信息");
                     logger.config("设定方面的信息");
                     logger.fine("细微的信息");
                     logger.finer("更细微的信息");
                     logger.finest("最细微的信息");
           }    
  }  
  
  输出: 
  2009-4-7 15:50:43 pku.sei.LoggingLevelDemo main
  严重:严重信息
  2009-4-7 15:50:43 pku.sei.LoggingLevelDemo main
  警告:警示信息
  2009-4-7 15:50:43 pku.sei.LoggingLevelDemo main
  信息:一般信息 

此示例中config()方法及以下的信息并没有显示出来,这是因为Logger的默认等级是INFO,比这个等级更低的信息,Logger并不会将信息输出

默认等级

Logger的默认等级是定义在执行环境的属性文件logging.properties中,这个文件位于JRE安装目录的lib目录下。部分内容如下:

  handlers = java.util.logging.ConsoleHandler 
  java.util.logging.ConsoleHandler.level = INFO 

logger默认的级别是INFO,比INFO更低的日志将不显示。
Logger的默认级别定义是在jre安装目录的lib下面。

  # Limit the message that are printed on the console to INFO and above. 
  java.util.logging.ConsoleHandler.level = INFO 

此外,还有一个级别OFF,可用来关闭日志记录,使用级别ALL启用所有消息的日志记录。

三、输出媒介控制器:Handler

输出媒介控制器将指定日志数据的输出媒介:如控制台、文件、远程主机或者是网络等。

Logger默认的输出媒介控制器(Handler)是java.util.logging.ConsolerHandler,也就是将信息输出至控制台。一个Logger可以拥有多个handler每个handler可以有自己的日志级别,在通过Logger的级别限制后,实际上还要再经过handler的级别限制。所以在上面的范例中如果想要看到所有的信息,则必须同时设定Logger与ConsoleHandler的级别。下面的范例示范了如何设定:

import java.util.logging.*;
public class LoggingLevelDemo2{
     public static void main(String[] args){

               Logger logger = Logger.getLogger("loggingLevelDemo2");

               // 显示所有等级的信息
               logger.setLevel(Level.ALL);
               // 创建输出媒介控制器并设定显示所有等级的信息
               ConsoleHandler consoleHandler = new ConsoleHandler();
               consoleHandler.setLevel(Level.ALL);

               // 为logger设定Handler为ConsoleHandler
               logger.addHandler(consoleHandler);

               logger.severe("严重信息");
               logger.warning("警示信息");
               logger.info("一般信息");
               logger.config("设定方面的信息");
               logger.fine("细微的信息");
               logger.finer("更细微的信息");
               logger.finest("最细微的信息");

     }
}

  运行结果: 
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  严重:严重信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  严重:严重信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  警告:警示信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  警告:警示信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  信息:一般信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  信息:一般信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  配置:设定方面的信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  良好:细微的信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  较好:更细微的信息
  2009-4-7 16:02:10 pku.sei.!LoggingLevelDemo2 main
  最好:最细微的信息 

Level.ALL表示显示所有的信息,所有这一次的执行结果可显示所有等级的信息。如果要关闭所有的信息,可以设定为Level.OFF。

Logger的Severe(),warning(),info()等方法,实际上是个便捷的方法。也可以直接使用log()方法并指定等级来执行相同的作用,如:

logger.log(Level.SEVERE, "严重信息"); 
使用Handler

Handler对象从Logger中获取日志信息,并将这些信息导出。例如,它可将这些信息写入控制台或文件中,也可以将这些信息发送到网络日志服务中,或将其转发到操作系统日志中。

Logger默认的输出处理者是ConsoleHandler。ConsoleHandler的输出是使用System.err对象,而信息的默认等级是INFO,这可以在JRE安装目录下lib目录的logging.properties中看到:

handlers = java.util.logging.ConsoleHandler 
java.util.logging.ConsoleHandler.level = INFO 

Java SE实现了5个Handler:
(1) java.util.logging.ConsoleHandler   以System.err输出日志;默认。
(2) java.util.logging.FileHandler   将信息输出到文件。
(3) java.util.logging.StreamHandle  以指定的!OutputStream实例输出日志。
(4) java.util.logging.SocketHandler  将信息通过Socket传送至远程主机。
(5) java.util.logging.!MemoryHandler  将信息暂存在内存中。

一个FileHandler的例子:

import java.io.IOException;
import java.util.logging.*;
public class HandlerDemo{
     public static void main(String[] args){
               Logger logger = Logger.getLogger("handlerDemo");
               try{
                    FileHandler fileHandler = new FileHandler("%h/myLogger.log");
                    logger.addHandler(fileHandler);
                    logger.info("测试信息");
               }catch (!SecurityException e)
                    e.printStackTrace();
               }
               catch (IOException e){
                    e.printStackTrace();
               }
     }
}

执行的结果会在命令行模式显示信息,并将结果输出至文件中。%h表示使用者的根目录(c:\document and settings\hexinyu目录中)。%t可以取得系统的暂存目录,%g自动为文件编号。例如可以设定为%h/myLogger%g.log,表示将.log文件存储在使用者根目录中,并自动为每个文件增加编号。

fileHandler默认的输出格式是XML格式。输出格式由java.util.logging.Formatter来控制,下一节详细介绍Formatter。 因此,此范例输出的文件内容如下:

<?xml version="1.0" encoding="GBK" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
    <record>
      <date>2009-04-07!T16:31:02</date>
      <millis>1239093062781</millis>
      <sequence>0</sequence>
      <logger>handlerDemo</logger>
      <level>INFO</level>
      <class>pku.sei.!HandlerDemo</class>
      <method>main</method>
      <thread>10</thread>
      <message>测试信息</message>
  </record>
</log>

四、Formatter

Formatter为格式化LogRecords提供支持。

一般来说,每个Handler都有关联的Formatter。Formatter接受LogRecord,并将它转换为一个字符串。

默认提供了两种Formatter:
  • java.util.logging.SimpleFormatter:标准日志格式,就是我们通常在启动一些诸如Tomcat、JBoss之类的服务器的时候经常能在控制台下看到的那种形式,就像这样:

    2004-12-20 23:08:52 org.apache.coyote.http11.Http11Protocol init
    信息: Initializing Coyote HTTP/1.1 on http-8080
    
  • java.util.logging.XMLFormatter:XML形式的日志格式,如果为Logger添加了一个new XMLFormatter(),那么就会以XML形式输出,不过更常用的是使用上面介绍的!FileHandler输出到XML文件中。

从上一节的例子可知,FileHandler的默认格式是java.util.logging.XMLFormatter,而ConsolerHandler的默认格式是java.util.logging.SimpleFormatter,可以使用Handler实例的setFormatter()方法来设定信息的输出格式。

例如:

  fileHandler.setFormatter(new SimpleFormatter()); 

FileHandler的Formatter设定为SimpleFormatter,则输出的日志文件内容就是简单的文字信息,打开文件后会发现与命令行模式下看到的信息内容相同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 3,874评论 2 8
  • 前言 在自动化测试实践过程中,必不可少的就是进行日志管理,方便调试和生产问题追踪,python提供了logg...
    苦叶子阅读 814评论 0 0
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,982评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 好吧,在我想到写这个题目的时候,想必你就应该知道我要说什么了吧!很简单,一句话,爱对了才是青春。最近的一波狗粮让我...
    德睿作者阅读 261评论 0 0