标签:author 规范 创建 list extend filename 一个 show different
偶然翻阅到一篇文章,注意到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.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.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 = INFO java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter # Example to customize the SimpleFormatter output format # to print one-line log message like this: # <level>: <log message> [<date/time>] # # 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
关于日志文件中,需要关注的第一点是:
需要关注的第二点是:
需要关注的第三点是:
需要关注的第四点是:
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级别的日志信息"); } }
由此,可以证明,①设定的日志级别仅能打印到本级别以及高级别的日志信息;②同名的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级别日志信息"); } }
控制台:
【注意】这里控制台打印了两遍相同的日志,是因为,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(); } } }
=======================================到这里,告一段落=========================================
【java】java自带的java.util.logging.Logger日志功能
标签:author 规范 创建 list extend filename 一个 show different
原文地址:http://www.cnblogs.com/sxdcgaq8080/p/7437263.html