JDK Logger 简介 (zhuan)

http://antlove.iteye.com/blog/1924832

*******************************************

一 简述

java.util.logging是JDK自带的日志记录包。

默认情况下,JDK的LogManager会在JRE目录下的"lib/logging.properties"这个文件中读取配置。

JDK的日志包涉及handler,formatter,level

名词 描述
handler

将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。

常用实现类 ConsoleHandlerFileHandlerSocketHandler

formatter 日志信息格式化类。常用实现类 SimpleFormatterXMLFormatter
level

日志记录级别。

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

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

 

二 简单Demo

MySimpleFormatter.java

Java代码  收藏代码
  1. package logging.formatter;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Date;  
  4. import java.util.logging.Level;  
  5. import java.util.logging.LogRecord;  
  6. import java.util.logging.SimpleFormatter;  
  7. public class MySimpleFormatter extends SimpleFormatter{  
  8.     private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  9.     private StringBuilder sb = new StringBuilder();  
  10.   
  11.     @Override  
  12.     public synchronized String format(LogRecord record)  
  13.     {  
  14.         Level level=record.getLevel();  
  15.         String time=sdf.format(new Date(record.getMillis()));  
  16.         String loggerName=record.getLoggerName();  
  17.         String message=record.getMessage();  
  18.           
  19.         this.sb.append("[").append(level).append("]");  
  20.         this.sb.append(" ").append(time);  
  21.         this.sb.append(" ").append(loggerName);  
  22.         this.sb.append(" :").append(message);  
  23.         this.sb.append(" ");  
  24.         return sb.toString();  
  25.     }  
  26. }  

 

DefaultStreamHandler.java

Java代码  收藏代码
  1. package logging.handler;  
  2. import java.io.OutputStream;  
  3. import java.util.logging.StreamHandler;  
  4. public class DefaultStreamHandler extends StreamHandler {  
  5.     @Override  
  6.     public synchronized void setOutputStream(OutputStream out)  
  7.             throws SecurityException {  
  8.         super.setOutputStream(out);  
  9.     }  
  10. }  

 

CustomLogManager.java

Java代码  收藏代码
  1. package logging.util;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.util.logging.ConsoleHandler;  
  5. import java.util.logging.FileHandler;  
  6. import java.util.logging.Level;  
  7. import java.util.logging.LogManager;  
  8. import java.util.logging.Logger;  
  9. import logging.formatter.MySimpleFormatter;  
  10. import logging.handler.DefaultStreamHandler;  
  11. public class CustomLogManager{  
  12.     static{  
  13.         LogManager.getLogManager().reset(); // reset the log manager  
  14.     }  
  15.       
  16.     // read the log configuration from outside property file  
  17.     public static void resetFromPropertyFile(String filePath){  
  18.         LogManager logManager = LogManager.getLogManager();    
  19.         InputStream inputStream = CustomLogManagerEditor.class.getClassLoader().getResourceAsStream(filePath);    
  20.         try {  
  21.             logManager.readConfiguration(inputStream);  
  22.         } catch (Exception e) {  
  23.             throw new RuntimeException("reload log configuration fail: "+e.toString());  
  24.         }         
  25.     }  
  26.   
  27.   
  28.     public static Logger getLogger(String name){  
  29.         Logger logger=Logger.getLogger(name);  
  30.         logger.setLevel(Level.ALL);  
  31.           
  32.         // add console handler  
  33.         ConsoleHandler consoleHandler=new ConsoleHandler();  
  34.         consoleHandler.setLevel(Level.FINE);  
  35.         consoleHandler.setFormatter(new MySimpleFormatter());  
  36.         logger.addHandler(consoleHandler);  
  37.           
  38.         // add file handler  
  39.         FileHandler fileHandler=null;  
  40.         try {  
  41.             fileHandler = new FileHandler("log.log",true);  
  42.             fileHandler.setLevel(Level.FINE);  
  43.             fileHandler.setFormatter(new MySimpleFormatter());  
  44.             logger.addHandler(fileHandler);  
  45.         } catch (SecurityException e) {  
  46.             e.printStackTrace();  
  47.         } catch (IOException e) {  
  48.             e.printStackTrace();  
  49.         }  
  50.           
  51.         // add default stream handler  
  52.         DefaultStreamHandler defaultStreamHandler = new DefaultStreamHandler();  
  53.         defaultStreamHandler.setLevel(Level.ALL);  
  54.         defaultStreamHandler.setFormatter(new MySimpleFormatter());  
  55.         defaultStreamHandler.setOutputStream(System.out);  
  56.         logger.addHandler(defaultStreamHandler);  
  57.           
  58.         return logger;  
  59.     }  
  60. }  

 

logging.properties

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

 

测试类

Main.java

 

Java代码  收藏代码
  1. package logging;  
  2. import java.io.IOException;  
  3. import java.util.logging.Logger;  
  4. import logging.util.CustomLogManager;  
  5. public class Main {  
  6.     public static void main(String[] args) throws SecurityException, IOException {  
  7. //      CustomLogManager.resetFromPropertyFile("logging/logging.properties");  
  8. //      Logger logger=Logger.getLogger(Main.class.getName());  
  9.           
  10.         Logger logger=CustomLogManager.getLogger(Main.class.getName());  
  11.           
  12.         logger.fine("warning test!");  
  13.     }  
  14. }  

 

 Note:

CustomLogManagerEditor.getLogger返回的logger拥有三个handler,所以记录日志信息的时候,日志信息会被存储到三个区域【log.log,System.out,System.err】。

当启用CustomLogManagerEditor.resetFromPropertyFile("logging/logging.properties");时,日志信息会被记录到控制台,以及u.log文件。

如果即调用CustomLogManagerEditor.resetFromPropertyFile("logging/logging.properties");又通过CustomLogManagerEditor.getLogger返回的logger记录日志,因为logger有5个handler,所以日志信息会被记录到4个区域【u.log,log.log,System.out,System.err】 其中在System.err中会记录2次。

 

 

原文地址:https://www.cnblogs.com/zhao1949/p/5955118.html