JDK日志管理组件:java.util.logging,这里只是简单汇总,并介绍个示例详情直接看JDK文档即可:


  • LogManager,存在一个单一的全局 LogManager 对象,它可用于维护 Logger 和日志服务的一组共享状态。
  • 此 LogManager 对象:

    • 管理 Logger 对象的层次结构名称空间。所有指定的 Logger 均存储在此名称空间中。
    • 管理一组日志控制属性。这些是供 Handler 及其他日志对象用于自我配置的简单键-值对。

    可以使用 LogManager.getLogManager() 获取全局 LogManager 对象。LogManager 对象是在类初始化过程中创建的,过后便不能更改。


  • Level 类定义了一组可用来控制日志输出的标准日志级别。日志 Level 对象是有序的,并且是通过有序的整数来指定。在给定的级别上启用日志记录也就启用了所有较高级别的日志记录。


  • Formatter 为格式化 LogRecords 提供支持。


  • LogRecord 对象用于在日志框架和单个日志 Handler 之间传递日志请求。


  • Logger 对象用来记录日志消息。


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


  • Logging.properties配置信息:实例见jre目录下/lib/logging.properties
    • 属性 “handlers”。该属性为 handler 类定义类名的空白或逗号分隔列表,以便作为处理程序在根 Logger(该 Logger 名为 ““)中加载和注册。每个类名必须用于具有默认构造方法的 Handler 类。注意,刚开始使用这些 Handler 时,它们可能是以延迟方式创建的。
    • 属性 “.handlers”。该属性为 handler 类定义空白分隔或逗号分隔的列表,以便作为处理程序加载和注册到指定的 logger。每个类名必须用于一个具有默认构造方法的 Handler 类。注意,刚开始使用这些 Handler 时,它们可能是以延迟方式创建的。
    • 属性 “.useParentHandlers”。该属性定义一个 boolean 值。默认情况下,每个 logger 除了自己处理日志消息外,还可能调用其父级来处理,这往往也会导致根 logger 来处理消息。将此属性设置为 false 时,需要为此 logger 配置 Handler,否则不传递任何消息。
    • 属性 “config”。此属性允许运行任意配置代码。该属性定义类名的空白或逗号分隔的列表。为每个指定类创建新实例。每个类的默认构造方法都可以执行任意代码来更新日志配置,如设置 logger 级别、添加处理程序、添加过滤器,等等。

    自定义Handler,讲日志保存到日期命名的文件中:

    public class MyStreamHandler extends StreamHandler{
        
        public MyStreamHandler()
        {
            super(getStream(), new SimpleFormatter());
        }
        
        private static OutputStream getStream()
        {
            OutputStream ostream = null;
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            String logName = format.format(Calendar.getInstance().getTime());
            File file = new File("./log/"+logName+".log");
            try {
                while(!file.exists()) file.createNewFile();
                ostream = new FileOutputStream(file);
            } catch (Exception e) {
                // TODO: handle exception
            }
            return ostream;
        }
    }

    修改LogManage配置,讲handler修改为自定义handler

    #properties配置信息
    #设置我自己定义的handler,将日志输出到我本地的文件,气十足合格也可以用JDK自带的FileHandler更加方便的实现。只是用自己实现的方式更家容易理解
    handlers= com.gong.jdklogging.MyStreamHandler
    .level= INFO
    public static void main(String[] args) {
        LogManager logManager = LogManager.getLogManager();
        try {
            InputStream stream = new FileInputStream(new File("./log/mylogging.properties"));
            logManager.readConfiguration(stream);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(logManager.getProperty("handlers"));
        Logger logger = Logger.getLogger("");
        logger.info("this is a test!");
        logger.info("this is a test!");
    }

    日志文件输出2014-06-03.log:

    2014-6-3 14:39:03 java.util.logging.LogManager$RootLogger log

    信息: this is a test!

    2014-6-3 14:39:03 java.util.logging.LogManager$RootLogger log

    信息: this is a test!

    FileHandler方式记录日志:具体配置信息参考SDK文档

    #设置我自己定义的handler,将日志输出到我本地的文件,气十足合格也可以用JDK自带的FileHandler更加方便的实现。只是用自己实现的方式更家容易理解
    handlers= java.util.logging.FileHandler
    
    java.util.logging.FileHandler.pattern = ./log/%g.log
    java.util.logging.FileHandler.limit = 400000
    java.util.logging.FileHandler.count = 5
    java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
    java.util.logging.FileHandler.append = true
    
    .level= INFO
    public class Main {
        public static void main(String[] args) {
            LogManager logManager = LogManager.getLogManager();
            try {
                InputStream stream = new FileInputStream(new File("./log/mylogging.properties"));
                logManager.readConfiguration(stream);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(logManager.getProperty("handlers"));
            Logger logger = Logger.getLogger("");
            for(int i = 0;i<100;i++)
            {
                logger.info(i+"this is a test");
            }
        }
    }

    输出: