標籤: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.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:# <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
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
=======================================到這裡,告一段落=========================================
【java】java內建的java.util.logging.Logger日誌功能