1. JUL
JUL,java.util.logging
先蒋,JDK自帶的日志框架橄仍。
使用樣例诬垂,
// 1. 獲取日志記錄器對(duì)象
Logger logger = Logger.getLogger("org.example.jul.JulTest");
// 2. 日志記錄輸出
logger.info("hello jul");
// 通用方法日志記錄
logger.log(Level.INFO, "info msg");
// 通過占位符方式輸出變量值
String name = "nlh";
Integer age = 13;
logger.log(Level.INFO, "用戶信息:{0}, {1}", new Object[]{name, age});
執(zhí)行過程绣溜,
- 初始化LogManager
- LogManager加載logging.properties配置
- 添加Logger到LogManager
- 從單例LogManager獲取Logger
- 設(shè)置級(jí)別Level慷彤,并指定日志記錄LogRecord
- Filter提供了日志級(jí)別之外更細(xì)粒度的控制
- Handler是用來處理日志輸出位置
- Formatter格式化LogRecord
默認(rèn)的日志輸出級(jí)別是INFO
,日志級(jí)別可以在類Level
下查看。
自定義輸出級(jí)別底哗,
// 1. 獲取日志記錄器對(duì)象
Logger logger = Logger.getLogger("org.example.jul.JulTest");
// 關(guān)閉系統(tǒng)默認(rèn)配置
logger.setUseParentHandlers(false);
// 自定義日志級(jí)別
// 創(chuàng)建handler
Handler handler = new ConsoleHandler();
// 創(chuàng)建簡(jiǎn)單格式轉(zhuǎn)換對(duì)象
Formatter formatter = new SimpleFormatter();
// 進(jìn)行關(guān)聯(lián)
handler.setFormatter(formatter);
logger.addHandler(handler);
// 配置日志具體級(jí)別
logger.setLevel(Level.ALL);
handler.setLevel(Level.ALL);
// 創(chuàng)建日志文件輸出
Handler fileHandler = new FileHandler("logs/jul.log");
fileHandler.setFormatter(formatter);
logger.addHandler(fileHandler);
// 2. 日志記錄輸出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
JUL中的Logger存在父子關(guān)系岁诉。默認(rèn)的頂層Logger是RootLogger,Logger之間的關(guān)系通過樹路徑關(guān)聯(lián)跋选。
Logger是用name作為標(biāo)志的涕癣,子Logger默認(rèn)使用父Logger的Handler,因此前标,在自定義Logger時(shí)坠韩,需要設(shè)置setUseParentHandlers
為false。
除了在類中定義Logger外炼列,還可以在配置文件logging.properties
中配置
handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
.level= ALL
# 自定義Logger
com.example.handlers = java.util.logging.ConsoleHandler
com.example.level = INFO
com.example.useParentHandlers = false
java.util.logging.FileHandler.pattern = logs/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%n
在類中加載配置文件同眯,
// 讀取配置文件,通過類加載器
InputStream ins = JulTest.class.getClassLoader().getResourceAsStream("logging.properties");
// 創(chuàng)建LogManager
LogManager logManager = LogManager.getLogManager();
// 通過LogManager加載配置文件
logManager.readConfiguration(ins);
// 創(chuàng)建日志記錄器
Logger logger = Logger.getLogger("com.example");
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
Logger logger2 = Logger.getLogger("test");
logger2.severe("severe test");
logger2.warning("warning test");
logger2.info("info test");
logger2.config("config tests");
logger2.fine("fine test");
2. Log4j
Maven倉庫地址唯鸭,
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Log4j主要有Loggers、Appenders和Layout三部分組成硅确。其中目溉,Loggers控制日志的輸出級(jí)別和日志是否輸出;Appenders指定日志的輸出方式菱农;Layout控制日志的輸出格式缭付。
常用Appenders有,
- ConsoleAppender
- FileAppender
- DailyRollingFileAppender
- RollingFileAppender
- JDBCAppender
快速開始循未,
// 初始化配置信息陷猫,使用代碼配置
BasicConfigurator.configure();
// 獲取日志記錄器對(duì)象
Logger logger = Logger.getLogger(Log4jTest.class);
// 日志記錄輸出
logger.info("Hello Log4j");
// 日志級(jí)別
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
其中,BasicConfigurator
類采用了默認(rèn)配置的妖,觀察它的源碼绣檬,驗(yàn)證了log4j由三部分組成。
同時(shí)嫂粟,log4j也支持配置文件設(shè)置娇未,默認(rèn)log4j.properties
,樣例如下星虹,
log4j.rootLogger = trace,console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
支持自定義logger
零抬,將來源不同的日志,輸出到不同的指定位置宽涌。例如平夜,下列配置,
log4j.rootLogger = trace,console
log4j.logger.org.example = info,file
log4j.logger.org.apache = error
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.file = logs/log4j.log
log4j.appender.file.encoding = UTF-8
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern = %r [%t] %p %c %x - %m%n
自定義了兩個(gè)Logger
卸亮,分別控制org.example
和org.apache
包下的日志輸出忽妒。org.example
的輸出級(jí)別是info
,采用名為file
的appender;而org.apache
的輸出級(jí)別是error
锰扶,沒有定義appender献酗,默認(rèn)采用rootLogger
的appender。在上述配置下坷牛,運(yùn)行下列代碼罕偎,
Logger logger = Logger.getLogger(Log4jTest.class);
logger.info("Hello Log4j");
logger.fatal("fatal");
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
Logger logger1 = Logger.getLogger(Logger.class);
logger1.fatal("fatal logger1");
logger1.error("error logger1");
logger1.warn("warn logger1");
在console中輸出結(jié)果為,
0 [main] INFO org.example.log4j.Log4jTest - Hello Log4j
1 [main] FATAL org.example.log4j.Log4jTest - fatal
2 [main] ERROR org.example.log4j.Log4jTest - error
2 [main] WARN org.example.log4j.Log4jTest - warn
2 [main] INFO org.example.log4j.Log4jTest - info
2 [main] FATAL org.apache.log4j.Logger - fatal logger1
2 [main] ERROR org.apache.log4j.Logger - error logger1
文件中的輸出結(jié)果為京闰,
0 [main] INFO org.example.log4j.Log4jTest - Hello Log4j
1 [main] FATAL org.example.log4j.Log4jTest - fatal
2 [main] ERROR org.example.log4j.Log4jTest - error
2 [main] WARN org.example.log4j.Log4jTest - warn
2 [main] INFO org.example.log4j.Log4jTest - info
達(dá)到了將不同來源的日志颜及,輸出到不同位置的效果。