JDK Log的设计思想

最近在看《Agile Java》,看到日志一节,收获颇多,所以发个贴总结和大家分享下。

JDK的日志框架的包名是java.util.logging,主要的类有:

Java代码 复制代码   收藏代码
  1. ConsoleHandler    
  2. ErrorManager    
  3. FileHandler    
  4. Formatter    
  5. Handler    
  6. Level    
  7. Logger    
  8. LoggingPermission    
  9. LogManager    
  10. LogRecord    
  11. MemoryHandler    
  12. SimpleFormatter    
  13. SocketHandler    
  14. StreamHandler    
  15. XMLFormatter  
ConsoleHandler 
ErrorManager 
FileHandler 
Formatter 
Handler 
Level 
Logger 
LoggingPermission 
LogManager 
LogRecord 
MemoryHandler 
SimpleFormatter 
SocketHandler 
StreamHandler 
XMLFormatter



其简单用法如下:

Java代码 复制代码   收藏代码
  1. Logger logger = Logger.getLogger(getClass().getName());  //根据当前的class.getName()获得日志实例   
  2. logger.info(message);  //用日志输出一条info级别的消息;  
Logger logger = Logger.getLogger(getClass().getName());  //根据当前的class.getName()获得日志实例
logger.info(message);  //用日志输出一条info级别的消息;




日志级别有7个等级,分别是:
severe严重、warning警告、info信息、config配置、fine良好、finner较好、finest最好
如果日志对象设置为警告,那么只能输出警告和严重的日志;

JDK中的日志设计使用了观察者模式,观察者就是Handler,发布日志时会调用所有注册(logger.addHandler(handler))过的Handler中的publish(LogRecord)方法。默认Handler就ConsoleHandler,还有FileHandler、SocketHandler,MemoryHandler。

每条日志都封装在LogRecord对象中。

默认情况下使用的jre\lib\logging.properties配置文件来输出日志,也可以通过java.util.logging.config.file系统属性来自定义日志属性配置文件。例如: java -Djava.util.logging.config.file=myfile

配置文件中有一段
        java.util.logging.FileHandler.pattern = %h/java%u.log

其中%h和%u叫做域,域%h告诉FileHandler将日志文件存储在用户主目录。FileHandler定义很多域,包括%t和%g,%t代表临时目录,%g代表循环计数,联合使用java.util.logging.FileHandler.count和java.util.logging.FileHandler.limit属性。属性limit代表以字节为单位的日志文件的上限。如果为0,表示日志文件大小不做限制。当日志文件的大小达到了上限,FileHandler对象会关闭该文件。域count指定FileHandler可以循环使用多少个日志文件。如果count为1,那么当达到上限时,FileHandler会继续使用原来的日志文件。

配置文件可以定义输出格式,每种格式都是java.util.logging.Formatter的子类,Sun提供了两种实现SimpleFormatter和XMLFormatter,前者生成两行日志信息,后者生成XML格式的日志。

你可能感兴趣的:(jdk)