美文网首页
Logger管理日志

Logger管理日志

作者: 拾壹北 | 来源:发表于2017-02-21 15:13 被阅读0次

    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,则输出的日志文件内容就是简单的文字信息,打开文件后会发现与命令行模式下看到的信息内容相同。

    相关文章

      网友评论

          本文标题:Logger管理日志

          本文链接:https://www.haomeiwen.com/subject/teruwttx.html