zoukankan      html  css  js  c++  java
  • jdk logging解析

    Logger    日志处理主类,是Api入口
    LoggerManager    日志管理器,Logger的工厂类,进行初始化Logger,Handler,Formatter等
    Handler    
    将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。

    常用实现类 ConsoleHandler, FileHandler, SocketHandler,一个Logger可以有多个handler

    Formatter    日志信息格式化类。常用实现类 SimpleFormatter, XMLFormatter,可以自定义类,每个handler都可以持有一个formatter,默认ConsoleHandler使用SimpleFormatter,而FileHandler使用XMLFormatter
    Level    
    日志记录级别。

    SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)

    ALL(记录所有信息)  OFF(不记录任何级别信息)

    Filter    
    过滤器,不同与日志级别,用于确定是否处理日志,,每个handler都可以持有一个filter,Logger会全局持有一个filter

    LogRecord    
    日志内容的封装类


    jdk logging默认的配置文件是JRE_HOME/lib/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

    可以看到默认只是开启了ConsoleHandler,

    可以自定义配置文件,handler和formatter:

    下面代码演示从新的配置文件加载文件,并添加自己的handler

    配置文件:

    #Level的五个等级SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)  。这个不同于log4j
    #指定默认logger级别
    .level= ALL
    #为 Handler 指定默认的级别(默认为 Level.INFO)。
    java.util.logging.ConsoleHandler.level=INFO
    # 指定要使用的 Formatter 类的名称(默认为 java.util.logging.SimpleFormatter)。
    java.util.logging.ConsoleHandler.formatter=com.hx.log.jdk.custom.MySimpleFormatter
    # 为 Handler 指定默认的级别(默认为 Level.ALL)。
    java.util.logging.FileHandler.level=INFO
    # 指定要使用的 Formatter 类的名称(默认为 java.util.logging.XMLFormatter)。
    java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
    # 指定要写入到任意文件的近似最大量(以字节为单位)。如果该数为 0,则没有限制(默认为无限制)。
    java.util.logging.FileHandler.limit=1024000
    # 指定有多少输出文件参与循环(默认为 1)。
    java.util.logging.FileHandler.count=1
    # 为生成的输出文件名称指定一个模式。有关细节请参见以下内容(默认为 "%h/java%u.log")。
    java.util.logging.FileHandler.pattern=u.xml
    # 指定是否应该将 FileHandler 追加到任何现有文件上(默认为 false)。
    java.util.logging.FileHandler.append=true
    handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler

    MyLogManager.java:


    package com.hx.log.jdk.custom;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.logging.*;
    public class MyLogManager {
      public static void resetFromPropertyFile(String filePath) {
        LogManager logManager = LogManager.getLogManager();
        logManager.reset();
        InputStream inputStream = MyLogManager.class.getClassLoader().getResourceAsStream(filePath);
        try {
          logManager.readConfiguration(inputStream);
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      public static Logger getLogger(String name) {
        Logger logger = Logger.getLogger(name);
        logger.setLevel(Level.ALL);
        for (Handler handler : logger.getHandlers()) {
          logger.removeHandler(handler);
        }
        // add console  handler
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.INFO);
        consoleHandler.setFormatter(new MySimpleFormatter());
        consoleHandler.setFilter(new Filter() {
          @Override
          public boolean isLoggable(LogRecord record) {
            return true;
          }
        });
        logger.addHandler(consoleHandler);
        // add file handler
        FileHandler fileHandler;
        try {
          fileHandler = new FileHandler("file.log", true);
          fileHandler.setLevel(Level.INFO);
          fileHandler.setFormatter(new MySimpleFormatter());
          logger.addHandler(fileHandler);
        } catch (SecurityException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
        // add default stream handler
        MyStreamHandler defaultStreamHandler = new MyStreamHandler();
        defaultStreamHandler.setLevel(Level.INFO);
        defaultStreamHandler.setFormatter(new MySimpleFormatter());
        defaultStreamHandler.setOutputStream(System.out);
        logger.addHandler(defaultStreamHandler);
        return logger;
      }
    }
    MySimpleFormatter.java:

    package com.hx.log.jdk.custom;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.logging.Level;
    import java.util.logging.LogRecord;
    import java.util.logging.SimpleFormatter;

    public class MySimpleFormatter extends SimpleFormatter {
      private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      @Override
      public synchronized String format(LogRecord record) {
        StringBuilder sb = new StringBuilder();
        Level level = record.getLevel();
        String time = sdf.format(new Date(record.getMillis()));
        String loggerName = record.getLoggerName();
        String message = record.getMessage();
        sb.append("[").append(level).append("]");
        sb.append(" ").append(time);
        sb.append(" ").append(loggerName);
        sb.append(" :").append(message);
        sb.append(" ");
        return sb.toString();
      }
    }
    MyStreamHandler.java:

    package com.hx.log.jdk.custom;
    import java.io.OutputStream;
    import java.util.logging.StreamHandler;
    public class MyStreamHandler extends StreamHandler {
      @Override
      public synchronized void setOutputStream(OutputStream out)
              throws SecurityException {
        super.setOutputStream(out);
      }
    }
    Test.java:

    package com.hx.log.jdk.custom;
    /**
     * Created by hx on 17-1-7.
     */
    import junit.framework.TestCase;
    import java.io.IOException;
    import java.util.logging.Filter;
    import java.util.logging.LogRecord;
    import java.util.logging.Logger;
    public class Test  extends TestCase{
      public void testDefault(){
        Logger logger=Logger.getLogger(Test.class.getName());//使用默认的配置
        logger.setFilter(new Filter() {
          @Override
          public boolean isLoggable(LogRecord record) {
            return true;
          }
        });
        logger.info(" test!");
      }
      public  void testMy()  throws SecurityException, IOException {
          MyLogManager.resetFromPropertyFile("log/jdk/logging.properties");
        Logger logger=MyLogManager.getLogger(Test.class.getName());
        logger.setFilter(new Filter() {
          @Override
          public boolean isLoggable(LogRecord record) {
            return true;
          }
        });
        logger.info(" test!");
      }
    }
    使用方法testdefault,只是在控制台打印信息:ConsoleHandler(System.err)

    使用方法testMy测试,会输出到五个目的地,包括自定义配置文件的ConsoleHandler(System.err),FileHandler(u.xml文件)和

    MyLoggerManager中添加的ConsoleHandler(System.err),FileHandler(file.log)和MyStreamHandler(System.out)

  • 相关阅读:
    TinyDBF-用200行的DBF解析器来展示良好架构设计
    如何让程序员更容易的开发Web界面?重构SmartAdmin展示TinyUI
    Linux下搭建Tiny开发环境
    《自己动手写框架7》:关于框架体系与战术的思考
    Velocity宏定义的坑与解决办法
    Tiny Formater
    Web前端开发规范
    笔记:2016-6-17
    笔记:2016-6-13
    笔记:2016-06-12
  • 原文地址:https://www.cnblogs.com/xingxingge/p/10311476.html
Copyright © 2011-2022 走看看