zoukankan      html  css  js  c++  java
  • java.util.logging.Logger使用详解

    java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着,其实在一些测试性的代码中,jdk自带的logger比log4j更方便。
     
    一、创建Logger对象
     
    static Logger getLogger(String name) 
              为指定子系统查找或创建一个 logger。 
    static Logger getLogger(String name, String resourceBundleName) 
              为指定子系统查找或创建一个 logger。 
    注意:name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个。
     
    二、Logger的级别
     
    比log4j的级别详细,全部定义在java.util.logging.Level里面。
    各级别按降序排列如下:
    • SEVERE(最高值)
    • WARNING
    • INFO
    • CONFIG
    • FINE
    • FINER
    • FINEST(最低值)
    此外,还有一个级别 OFF,可用来关闭日志记录,使用级别 ALL 启用所有消息的日志记录。
     
    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
     
    三、简单实例
     
    public class TestLogger { 
            public static void main(String[] args) { 
                    Logger log = Logger.getLogger("lavasoft"); 
                    log.setLevel(Level.INFO); 
                    Logger log1 = Logger.getLogger("lavasoft"); 
                    System.out.println(log==log1);     //true 
                    Logger log2 = Logger.getLogger("lavasoft.blog"); 
                    log2.setLevel(Level.WARNING); 

                    log.info("aaa"); 
                    log2.info("bbb"); 
                    log2.fine("fine"); 
            } 
    }
     
    true 
    2009-7-28 20:00:30 TestLogger main 
    信息: aaa 

    Process finished with exit code 0
     
    当注释掉        log2.setLevel(Level.WARNING);
    输出结果:
    true 
    2009-7-28 20:02:02 TestLogger main 
    信息: aaa 
    2009-7-28 20:02:02 TestLogger main 
    信息: bbb 

    Process finished with exit code 0
     
    从这里可以看出,logger的名字是有层级关系的。这和log4j的控制方式完全一致。
     
    下面是API文档的原文:
    一般使用圆点分隔的层次命名空间来命名 Logger。Logger 名称可以是任意的字符串,但是它们一般应该基于被记录组件的包名或类名,如 java.net 或 javax.swing。此外,可以创建“匿名”的 Logger,其名称未存储在 Logger 命名空间中。
    可通过调用某个 getLogger 工厂方法来获得 Logger 对象。这些方法要么创建一个新 Logger,要么返回一个合适的现有 Logger。
     
    四、Logger的Handler
     
    Handler 对象从 Logger 中获取日志信息,并将这些信息导出。例如,它可将这些信息写入控制台或文件中,也可以将这些信息发送到网络日志服务中,或将其转发到操作系统日志中。

    可通过执行 setLevel(Level.OFF) 来禁用 Handler,并可通过执行适当级别的 setLevel 来重新启用。

    Handler 类通常使用 LogManager 属性来设置 Handler 的 Filter、Formatter 和 Level 的默认值。
    java.util.logging.Handler 
      java.util.logging.MemoryHandler 
      java.util.logging.StreamHandler 
        java.util.logging.ConsoleHandler 
        java.util.logging.FileHandler 
        java.util.logging.SocketHandler
     
    例子:
    public class TestLogger { 
            public static void main(String[] args) throws IOException { 
                    Logger log = Logger.getLogger("lavasoft"); 
                    log.setLevel(Level.INFO); 
                    Logger log1 = Logger.getLogger("lavasoft"); 
                    System.out.println(log==log1);     //true 
                    Logger log2 = Logger.getLogger("lavasoft.blog"); 
    //                log2.setLevel(Level.WARNING); 

                    ConsoleHandler consoleHandler =new ConsoleHandler(); 
                    consoleHandler.setLevel(Level.ALL); 
                    log.addHandler(consoleHandler); 
                    FileHandler fileHandler = new FileHandler("C:/testlog%g.log"); 
                    fileHandler.setLevel(Level.INFO); 
                    log.addHandler(fileHandler); 
                    log.info("aaa"); 
                    log2.info("bbb"); 
                    log2.fine("fine"); 
            } 
    }
     
    输出结果:
    true 
    2009-7-28 20:36:14 TestLogger main 
    信息: aaa 
    2009-7-28 20:36:14 TestLogger main 
    信息: aaa 
    2009-7-28 20:36:14 TestLogger main 
    信息: bbb 
    2009-7-28 20:36:14 TestLogger main 
    信息: bbb 

    Process finished with exit code 0
     
    查看C盘:
     
    可见,默认的日志方式是xml格式,很烂。所以最好自定义下logger的格式。需要用Formatter来定义。
     
    五、Logger的Formatter
     
    Formatter 为格式化 LogRecords 提供支持。 
    一般来说,每个日志记录 Handler 都有关联的 Formatter。Formatter 接受 LogRecord,并将它转换为一个字符串。 
    有些 formatter(如 XMLFormatter)需要围绕一组格式化记录来包装头部和尾部字符串。可以使用 getHeader 和 getTail 方法来获得这些字符串。
     
    LogRecord 对象用于在日志框架和单个日志 Handler 之间传递日志请求。
    LogRecord(Level level, String msg) 
              用给定级别和消息值构造 LogRecord。
     
    java.util.logging.Formatter 
      java.util.logging.SimpleFormatter 
      java.util.logging.XMLFormatter
     
    看个例子就明白了:
    public class TestLogger { 
            public static void main(String[] args) throws IOException { 
                    Logger log = Logger.getLogger("lavasoft"); 
                    log.setLevel(Level.INFO); 
                    Logger log1 = Logger.getLogger("lavasoft"); 
                    System.out.println(log == log1);     //true 
                    Logger log2 = Logger.getLogger("lavasoft.blog"); 
    //                log2.setLevel(Level.WARNING); 

                    ConsoleHandler consoleHandler = new ConsoleHandler(); 
                    consoleHandler.setLevel(Level.ALL); 
                    log.addHandler(consoleHandler); 
                    FileHandler fileHandler = new FileHandler("C:/testlog%g.log"); 
                    fileHandler.setLevel(Level.INFO); 
                    fileHandler.setFormatter(new MyLogHander()); 
                    log.addHandler(fileHandler); 

                    log.info("aaa"); 
                    log2.info("bbb"); 
                    log2.fine("fine"); 
            } 


    class MyLogHander extends Formatter { 
            @Override 
            public String format(LogRecord record) { 
                    return record.getLevel() + ":" + record.getMessage()+" "
            } 
    }
     
    输出:
    在控制和C盘输出的文件如图
     
    到此,Java自带的Logger内容就没了。
  • 相关阅读:
    (双指针 二分) leetcode 167. Two Sum II
    (双指针) leetcode 485. Max Consecutive Ones
    (双指针) leetcode 27. Remove Element
    (String) leetcode 67. Add Binary
    (数组) leetcode 66. Plus One
    (N叉树 BFS) leetcode429. N-ary Tree Level Order Traversal
    (N叉树 递归) leetcode 590. N-ary Tree Postorder Traversal
    (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal
    (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
    (BST 递归) leetcode98. Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/dyc-cfc/p/4177466.html
Copyright © 2011-2022 走看看