日志:Core Java 7.5

开发人员应该用logger.fine( obj )来取代System.out.println( obj );
当调用 System.out.println 时, 实际上生成了下面的日志消息:logger.fine();

JDK的日志系统有以下几个主要的类和概念:

日志记录器 Logger

  • 记录器负责暂存日志数据到内存中
  • 只有当某条日志的级别高于记录器设定的阈值时,此条日志才会被记录器记录到内存。
  • Logger可以自行指定处理器/日志级别的阈值

日志处理器 LogHandler

  • 负责将暂存在内存中的记录写入到File(FileHandler)或者Console(ConsoleHandler)控制台
  • 只有当某条日志记录的级别高于处理器设定的阈值时,此条日志记录才会被写入到File或者控制台
  • 默认情况下,日志记录器会将记录发送到ConsoleHandler中,并由他输出到System.err流中(阈值默认为INFO)
  • 默认情况下,日志记录器还会将日志记录发送到自己的处理器的父处理器中,而最终的父处理器有一个ConsoleHandler父处理器会再次对日志处理(写到文件或者哪里)。
  • 由于默认会有父处理器会再次对记录进行处理,而我们并不想将一个记录处理两次,因此一般需要设置logger.setUseParentHandlers(false)
  • jdk提供的日志处理器:FileHandler、ConsoleHandler、SocketHandler-可以指定主机和端口。
  • FileHandler默认将日志写到用户主目录的javan.log文件中。

日志管理器 管理日志配置 LogManager**

负责管理JDK日志系统的配置信息,比如日志级别、使用哪个日志处理器等。

日志配置文件
  • JRE默认的日志配置文件是:jre/lib/logging.properties

可以在启动命令中,更改日志配置文件的位置:
java -Djava.util.logging.config.file=configfilepath mainClass

日志管理器LogManager会在JVM启动过程中初始化,在main方法调用之前完成。
但也也可以在main方法中更改日志配置文件的位置:System.setProperty("java.util.logging.config.file",configfilepath),这会触发LogManager.readConfiguration()来重新初始化日志管理器。

日志配置项

可以在日志配置文件中设置如下配置项

com.mycomp.myapp.level=FINE

java.util.logging.ConsoleHandler.level=Level.INFO

java.util.logging.FileHandler.level=Level.ALL
java.util.logging.FileHandler.append=false (如果设置为true的话,那么这个Handler会将自己处理的记录追加到已经存在的日志文件的尾部,如果多个应用程序副本使用同一个日志文件,应设为true。)
java.util.logging.FileHandler.limit=50000(每个日志文件的最大字节数)
java.util.logging.FileHandler.count=1(共可创建多少个日志文件——默认为1个。即当日志记录逐渐增多,1个文件的大小已经达到limit后,会清掉旧的日志记录,仍在这1个文件中保存新的记录。如果设置为10,则当10个日志文件都已经满了后,会删除掉原来的第0个日志文件,创建一个新的与0同名的日志文件,然后新的日志记录写到此文件中)
java.util.logging.FileHandler.pattern=%h/java%u.log(日志文件名的模式,一般改成%h/myapp.log,/是路径中的文件夹分隔符)
java.util.logging.FileHandler.filter=无(使用什么过滤器类)
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter(日志记录的格式器)

日志文件名模式变量:

变量名 描述
%h 系统属性user.home的值
%t 系统临时目录
%u 用于解决冲突的唯一编号,如果多个应用程序使用同一个日志文件名,应该加%u,以便每一个应用程序副本都有自己唯一的日志副本
%g 循环日志记录生成的数值
%% %字符

示例

Logger logger = Logger.getLogger("应用程序的根包全限定路径名");  // 获得一个日志记录器,如果不存在在创建。后续所有类都可以通过Logger.getLogger("应用程序的根包全限定路径名")直接获得并使用这个logger去记录日志。
logger.setLevel(Levle.FINE); //  设置记录器的日志级别的阈值
Handler handler  = new ConsoleHandler();
handler.setLevel(Level.FINE);
logger.setHandler(handler);
logger.setUseParentHandler(false);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章