1.1 java 日志
java拥有一个设计良好的类集--java.util.logging,通过日志系统来控制、格式化以及发布消息。日志系统功能非常强大,可以设置日志消息的优先级,可以通过过滤器来选择感兴趣的信息。并且消息可以输出到Handler对象能够处理的任意源,如控制台、窗口、数据库、本地文件等等。
1.1.1 主要类
· Logger:应用程序进行 logging 调用的主要实体。Logger 对象用来记录特定系统或应用程序组件的日志消息。
· LogRecord:用于在 logging框架和单独的日志处理程序之间传递 logging 请求。
· Handler:将 LogRecord 对象导出到各种目的地,包括内存、输出流、控制台、文件和套接字。
· Level:定义一组可以用来控制logging输出的标准logging级别。可以配置程序为某些级别输出 logging,而同时忽略其他输出。
· Filter:为所记录的日志提供日志级别控制以外的细粒度控制。Logging API 支持通用的过滤器机制,该机制允许应用程序代码附加任意的过滤器以控制 logging 输出。
· Formatter:为格式化 LogRecord 对象提供支持。此包包括的两个格式化程序SimpleFormatter和XMLFormatter分别用于格式化纯文本或 XML 中的日志记录。
1.1.2 配置日志属性
LogManager类控制着整个日志系统。其实例在LogManager初始化期间创建。LogManager包括了拥有所有指定Logger对象的层次式名字空间,也包括了日志系统配置中的Handlers以及其他对象所使用的日志控制属性。
日志控制属性可以从配置文件中获取,从输入流中读取,也可以采用在Handler初始化时来设置。
(1)配置文件
一般情况下,LogManage首先读取默认配置文件,该配置文件位于jdk-path/jre/lib文件夹下,文件名为logging.properties。配置文件中有两个系统属性若被配置,系统将不从配置文件中获取属性,而是按照系统属性来获取属性。两系统属性如下:
1)java.util. logging.config.file 自定义配置文件路径。
2)ava.util.logging.config.class自定义类负责读入配置信息。
如果这两个属性都没有被配置,那么Java将使用默认logging. properties文件中的属性。
此外,我们还可以让LogManager直接不读取默认配置文件,我们需要在LogManager初始化之前设置系统属性,如:
System.setProperty("java.util.logging.config.file",configPath/logging.properties),这样,LogManager将从该文件读取属性而不从默认配置文件。
(2)LogManage 的readConfiguration方法
LogManage 从InputStream中读取配置文件。
(3)Handler初始化
如:FileHandler(String pattern, int limit, int count, boolean append)
Pattern为文件保存路径,limit为每个文件大小,count为文件数,append为数据写入是否采用添加的方式。
1.1.3 日志系统的运行流程
读取日志控制属性 |
创建Logger对象OBJ |
OBJ添加Handler |
OBJ发送消息 |
创建Handler对象 |
(1)首先创建Handler对象
可以实例化logging包提供的FileHandler、ConsoleHandler等类,也可以是由Handler类继承而来的自定义类。对象初始化时,其属性根据读取的日志控制属性来配置,若初始化类有参数则参数对应的属性修改为参数值。属性中日志的显示方式、显示内容也可以由对象的方法进行修改。如:
l setLevel设置消息级别
l setFilter设置依据消息级别过滤消息的过滤器
l etFormatter 设置消息显示格式。
(2)创建Logger对象,添加Handler,并为Logger对象设置属性
Logger类是logging类库中执行日志操作的类。在创建对象后必须为其添加消息发送的对象Handler,此外还可以设置的部分属性,主要包括:
l setLevel 当发送消息级别大于等于设置的级别时,消息才发送。
l setFilter 设置消息发送的过滤器。
l setUseParentHandlers 当设置为否时,将不执行默认Handler的操作。
(3)发送消息
Logger对象向Handler对象发送消息。发送内容包括消息级别和消息内容两部分。可以调用将消息级别和内容作为参数的log方法,也可以是只有消息内容参数的消息级别方法(如:info、warning)。
1.1.4 自定义日志功能简介
我们可以通过自定义部分类和接口,来达到自定义日志功能的目的。
(1)Handler类
继承Handler抽象类,重写publish方法。在该方法中可以定义以何种方式(窗口、数据库等)显示消息,还可以定义消息内容、设置消息格式。
(2)Formatter类
继承Formatter类,重写formatMessage方法,定义消息内容、设置消息格式。
(3)Filter接口
在isLoggable方法中,依据消息级别来选择的需要发送的消息。
1.1.5 日志系统的运用实例
(1)自定义配置文件
依据logging.properties格式在d盘根目录下自定义了配置文件newLog.properties,其中fileHandler部分内容如图1
(2)实例代码:
//为LogManager设置新配置文件
System.setProperty("java.util.logging.config.file",”d://newLog.properties”);
//新建文件句柄对象,并设置属性
FileHandler handler = new FileHandler()
handler.setFormatter(new SimpleFormatter());
//新建Logger对象,设其属性,并发送消息
Logger logger=Logger.getLogger("logger")
logger.addHandler(handler)
logger.log(Level.INFO,” This is the first logging info!”)
logger.config("I am a config message");
logger.warning("The warning info is coming!");
(3)结果
在d盘根目录下生成log.log文件。内容如图2