博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java】java自带的java.util.logging.Logger日志功能
阅读量:6569 次
发布时间:2019-06-24

本文共 6253 字,大约阅读时间需要 20 分钟。

偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下。

1.Java自带的日志功能,默认的配置

  ①Logger的默认配置,位置在JRE安装目录下lib中的logging.properties中

  ②logging.properties日志文件内容如下:

#############################################################      Default Logging Configuration File## You can use a different file by specifying a filename# with the java.util.logging.config.file system property.  # For example java -Djava.util.logging.config.file=myfile#########################################################################################################################      Global properties############################################################# "handlers" specifies a comma separated list of log Handler # classes.  These handlers will be installed during VM startup.# Note that these classes must be on the system classpath.# By default we only configure a ConsoleHandler, which will only# show messages at the INFO and above levels.handlers= java.util.logging.ConsoleHandler# To also add the FileHandler, use the following line instead.#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler# Default global logging level.# This specifies which kinds of events are logged across# all loggers.  For any given facility this global level# can be overriden by a facility specific level# Note that the ConsoleHandler also has a separate level# setting to limit messages printed to the console..level= INFO############################################################# Handler specific properties.# Describes specific configuration info for Handlers.############################################################# default file output is in user's home directory.java.util.logging.FileHandler.pattern = %h/java%u.logjava.util.logging.FileHandler.limit = 50000java.util.logging.FileHandler.count = 1java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter# Limit the message that are printed on the console to INFO and above.java.util.logging.ConsoleHandler.level = INFOjava.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter# Example to customize the SimpleFormatter output format # to print one-line log message like this:#     
:
[
]## java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n############################################################# Facility specific properties.# Provides extra control for each logger.############################################################# For example, set the com.xyz.foo logger to only log SEVERE# messages:com.xyz.foo.level = SEVERE
View Code

  关于日志文件中,需要关注的第一点是:

  

  需要关注的第二点是:

  需要关注的第三点是:

  需要关注的第四点是:

 

2.java.util.logging.Level类设定了日志级别类的设定

 

可以从API看出来,出了以下的Level各个级别,还有OFF和ALL两个级别。

如果设置为Level.INFO级别的话,日志只会显示INFO以及以上的级别。

 

 

 

 3.Logger的简单使用

首先明确一点,java.util.logging.Logger的初始化方法

  

static Logger getLogger(String name)

name代表你的Logger名称,如果指定getLogeger相同名称,则仅会创建一个对象

static Logger getLogger(String name, String resourceBundleName)

name代表你的Logger名称,resourceBundleName代表本地化的Logger名称,也就是记录到本地磁盘的日志文件中,每一条Logger的名称

 

接下来,看看效果:

  

package com.sxd.util;import java.util.logging.Level;import java.util.logging.Logger;import org.junit.Test;/** * 测试Java自带的Log日志功能 * @author sxd * */public class TestLog {        @Test    public void test(){        Logger log1 = Logger.getLogger("log-Test");        log1.setLevel(Level.INFO);        Logger log2 = Logger.getLogger("log-Test");        System.out.println("log1和log2是否相等:"+(log1 == log2));    //true        Logger log3 = Logger.getLogger("log-test");        System.out.println("log1和log3是否相等:"+(log1 == log3));    //false        log3.setLevel(Level.WARNING);                log1.info("info级别打印:info级别的日志信息");        log3.info("warning级别打印:info级别的日志信息");        //打印不出来        log3.severe("warning级别打印:severe级别的日志信息");                            }}
View Code

由此,可以证明,①设定的日志级别仅能打印到本级别以及高级别的日志信息;②同名的Logger仅会创建一个。

 

4.设定FileHandler,为日志本地化设定

package com.sxd.util;import java.io.IOException;import java.util.logging.ConsoleHandler;import java.util.logging.FileHandler;import java.util.logging.Level;import java.util.logging.Logger;import org.junit.Test;/** * 测试Java自带的Log日志功能 * @author sxd * */public class TestLog {        @Test    public void test() throws SecurityException, IOException{        Logger log1 = Logger.getLogger("log-Test");        ConsoleHandler consoleHandler = new ConsoleHandler();        consoleHandler.setLevel(Level.ALL);        log1.addHandler(consoleHandler);                FileHandler fileHandler = new FileHandler("d:/testLog%g.log");        fileHandler.setLevel(Level.WARNING);        log1.addHandler(fileHandler);                log1.info("ALL级别打印:info级别的日志信息");        log1.severe("warning级别打印:severe级别日志信息");            }}
View Code

控制台:

【注意】这里控制台打印了两遍相同的日志,是因为,java默认的已经设定了一个ConsoleHandler,但是这个级别是INFO级别的。

    而程序中有重新设定了一个新的ConsoleHandler,这个级别是ALL的,两个不一样,所以都执行了打印,所以打印了两遍一模一样的。

 本地日志文件:

 

【注意】仅打印了一个日志,这个根据代码日志级别就可以理解。

    关键日志文件是XML格式的内容,是因为上面解释了FileHandler的相关设置中,默认是XML格式

【注意2】FileHandler指定日志文件名称,有以下的规范:

 

 5.为本地化的日志文件设置自定义的日志格式

java.util.logging.LogRecord;

java.util.logging.Formatter;

package com.sxd.util;import java.io.IOException;import java.util.logging.ConsoleHandler;import java.util.logging.FileHandler;import java.util.logging.Formatter;import java.util.logging.Level;import java.util.logging.LogRecord;import java.util.logging.Logger;import org.junit.Test;/** * 测试Java自带的Log日志功能 * @author sxd * */public class TestLog {        @Test    public void test() throws SecurityException, IOException{        Logger log1 = Logger.getLogger("log-Test");                FileHandler fileHandler = new FileHandler("d:/testLog%g.log");        fileHandler.setLevel(Level.WARNING);        fileHandler.setFormatter(new MyFormatter());        log1.addHandler(fileHandler);                log1.severe("warning级别打印:severe级别日志信息");            }        class MyFormatter extends Formatter{        @Override        public String format(LogRecord record) {            return record.getLoggerName()                     + ">>"                    +record.getLevel()                    +">>"                    +record.getMessage();        }            }    }
View Code

 

 

 

 

=======================================到这里,告一段落=========================================

转载地址:http://xqvjo.baihongyu.com/

你可能感兴趣的文章
【hibernate框架】练习-树状结构设计(非常重要)
查看>>
Java IO: 序列化与ObjectInputStream、ObjectOutputStream
查看>>
[LeetCode]10.Regular Expression Matching
查看>>
如何用Sencha Touch打包Android的APK
查看>>
Android ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)
查看>>
node.js学习笔记(27) node-orm进阶二
查看>>
静态分析安全测试(SAST)优缺点探析
查看>>
One minute io hang when Add ISL Trunking License to Brocade Fabric
查看>>
数组首地址取地址
查看>>
Android:一步步开发一个高度可定制化的扩展菜单
查看>>
Javascript是如何工作的: Engine, Runtime 和 Call Stack的概述
查看>>
leetcode爬坑史(一)-- [14] 最长公共前缀
查看>>
Linux 安装 GitLab ,及首次配置使用
查看>>
js正则表达式
查看>>
说一说js防抖节流的事情
查看>>
react与动态input的问题
查看>>
python语法基础及if、while、for等语句介绍
查看>>
iOS OpenGL开发(三)- OpenGL渲染架构解析
查看>>
JDK1.8 -lambda中常用内置函数式接口
查看>>
想要成为大牛应该做到以下几点
查看>>