zoukankan      html  css  js  c++  java
  • 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下。

    1.Java自带的日志功能,默认的配置

      ①Logger的默认配置,位置在JRE安装目录下lib中的logging.properties中

      ②logging.properties日志文件内容如下:

    ############################################################
    #      Default Logging Configuration File
    #
    # You can use a different file by specifying a filename
    # with the java.util.logging.config.file system property.  
    # For example java -Djava.util.logging.config.file=myfile
    ############################################################
    
    ############################################################
    #      Global properties
    ############################################################
    
    # "handlers" specifies a comma separated list of log Handler 
    # classes.  These handlers will be installed during VM startup.
    # Note that these classes must be on the system classpath.
    # By default we only configure a ConsoleHandler, which will only
    # show messages at the INFO and above levels.
    handlers= java.util.logging.ConsoleHandler
    
    # To also add the FileHandler, use the following line instead.
    #handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
    
    # Default global logging level.
    # This specifies which kinds of events are logged across
    # all loggers.  For any given facility this global level
    # can be overriden by a facility specific level
    # Note that the ConsoleHandler also has a separate level
    # setting to limit messages printed to the console.
    .level= INFO
    
    ############################################################
    # Handler specific properties.
    # Describes specific configuration info for Handlers.
    ############################################################
    
    # default file output is in user's home directory.
    java.util.logging.FileHandler.pattern = %h/java%u.log
    java.util.logging.FileHandler.limit = 50000
    java.util.logging.FileHandler.count = 1
    java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
    
    # Limit the message that are printed on the console to INFO and above.
    java.util.logging.ConsoleHandler.level = INFO
    java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    
    # Example to customize the SimpleFormatter output format 
    # to print one-line log message like this:
    #     <level>: <log message> [<date/time>]
    #
    # java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
    
    ############################################################
    # Facility specific properties.
    # Provides extra control for each logger.
    ############################################################
    
    # For example, set the com.xyz.foo logger to only log SEVERE
    # messages:
    com.xyz.foo.level = SEVERE
    View Code

      关于日志文件中,需要关注的第一点是:

      

      需要关注的第二点是:

      需要关注的第三点是:

      需要关注的第四点是:

    2.java.util.logging.Level类设定了日志级别类的设定

    可以从API看出来,出了以下的Level各个级别,还有OFF和ALL两个级别。

    如果设置为Level.INFO级别的话,日志只会显示INFO以及以上的级别。

     

     3.Logger的简单使用

    首先明确一点,java.util.logging.Logger的初始化方法

      

    static Logger getLogger(String name) 

    name代表你的Logger名称,如果指定getLogeger相同名称,则仅会创建一个对象

    static Logger getLogger(String name, String resourceBundleName) 

    name代表你的Logger名称,resourceBundleName代表本地化的Logger名称,也就是记录到本地磁盘的日志文件中,每一条Logger的名称

    接下来,看看效果:

      

    package com.sxd.util;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import org.junit.Test;
    
    
    /**
     * 测试Java自带的Log日志功能
     * @author sxd
     *
     */
    public class TestLog {
        
        @Test
        public void test(){
            Logger log1 = Logger.getLogger("log-Test");
            log1.setLevel(Level.INFO);
            Logger log2 = Logger.getLogger("log-Test");
            System.out.println("log1和log2是否相等:"+(log1 == log2));    //true
            Logger log3 = Logger.getLogger("log-test");
            System.out.println("log1和log3是否相等:"+(log1 == log3));    //false
            log3.setLevel(Level.WARNING);
            
            log1.info("info级别打印:info级别的日志信息");
            log3.info("warning级别打印:info级别的日志信息");        //打印不出来
            log3.severe("warning级别打印:severe级别的日志信息");
            
            
            
        }
    }
    View Code

    由此,可以证明,①设定的日志级别仅能打印到本级别以及高级别的日志信息;②同名的Logger仅会创建一个。

    4.设定FileHandler,为日志本地化设定

    package com.sxd.util;
    
    import java.io.IOException;
    import java.util.logging.ConsoleHandler;
    import java.util.logging.FileHandler;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import org.junit.Test;
    
    
    /**
     * 测试Java自带的Log日志功能
     * @author sxd
     *
     */
    public class TestLog {
        
        @Test
        public void test() throws SecurityException, IOException{
            Logger log1 = Logger.getLogger("log-Test");
            ConsoleHandler consoleHandler = new ConsoleHandler();
            consoleHandler.setLevel(Level.ALL);
            log1.addHandler(consoleHandler);
            
            FileHandler fileHandler = new FileHandler("d:/testLog%g.log");
            fileHandler.setLevel(Level.WARNING);
            log1.addHandler(fileHandler);
            
            log1.info("ALL级别打印:info级别的日志信息");
            log1.severe("warning级别打印:severe级别日志信息");
            
        }
    }
    View Code

    控制台:

    【注意】这里控制台打印了两遍相同的日志,是因为,java默认的已经设定了一个ConsoleHandler,但是这个级别是INFO级别的。

        而程序中有重新设定了一个新的ConsoleHandler,这个级别是ALL的,两个不一样,所以都执行了打印,所以打印了两遍一模一样的。

     本地日志文件:

    【注意】仅打印了一个日志,这个根据代码日志级别就可以理解。

        关键日志文件是XML格式的内容,是因为上面解释了FileHandler的相关设置中,默认是XML格式

    【注意2】FileHandler指定日志文件名称,有以下的规范:

     5.为本地化的日志文件设置自定义的日志格式

    java.util.logging.LogRecord;

    java.util.logging.Formatter;

    package com.sxd.util;
    
    import java.io.IOException;
    import java.util.logging.ConsoleHandler;
    import java.util.logging.FileHandler;
    import java.util.logging.Formatter;
    import java.util.logging.Level;
    import java.util.logging.LogRecord;
    import java.util.logging.Logger;
    
    import org.junit.Test;
    
    
    /**
     * 测试Java自带的Log日志功能
     * @author sxd
     *
     */
    public class TestLog {
        
        @Test
        public void test() throws SecurityException, IOException{
            Logger log1 = Logger.getLogger("log-Test");
            
            FileHandler fileHandler = new FileHandler("d:/testLog%g.log");
            fileHandler.setLevel(Level.WARNING);
            fileHandler.setFormatter(new MyFormatter());
            log1.addHandler(fileHandler);
            
            log1.severe("warning级别打印:severe级别日志信息");
            
        }
        
        class MyFormatter extends Formatter{
    
            @Override
            public String format(LogRecord record) {
                return record.getLoggerName() 
                        + ">>"
                        +record.getLevel()
                        +">>"
                        +record.getMessage();
            }
            
        }
        
    }
    View Code

     

    =======================================到这里,告一段落=========================================

  • 相关阅读:
    mysql truncate
    蠕虫复制
    mysql 一对多,多对多
    php实现文件下载
    JetBrains PhpStorm 整个项目中查找一个词语
    vim
    程序员减少代码BUG的7种方法,拒绝编程5分钟,查代码2小时!
    创建你的第一个Composer/Packagist包
    Elasticsearch
    Laravel 实践之路: 数据库迁移与数据填充
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/7437263.html
Copyright © 2011-2022 走看看