JUL和Log4j

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í)行過程绣溜,

  1. 初始化LogManager
    1. LogManager加載logging.properties配置
    2. 添加Logger到LogManager
  2. 從單例LogManager獲取Logger
  3. 設(shè)置級(jí)別Level慷彤,并指定日志記錄LogRecord
  4. Filter提供了日志級(jí)別之外更細(xì)粒度的控制
  5. Handler是用來處理日志輸出位置
  6. 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.exampleorg.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á)到了將不同來源的日志颜及,輸出到不同位置的效果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹂楣,一起剝皮案震驚了整個(gè)濱河市俏站,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊土,老刑警劉巖肄扎,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赁酝,居然都是意外死亡犯祠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門酌呆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衡载,“玉大人,你說我怎么就攤上這事隙袁√涤椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵菩收,是天一觀的道長梨睁。 經(jīng)常有香客問我,道長娜饵,這世上最難降的妖魔是什么而姐? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮划咐,結(jié)果婚禮上拴念,老公的妹妹穿的比我還像新娘。我一直安慰自己褐缠,他們只是感情好政鼠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著队魏,像睡著了一般公般。 火紅的嫁衣襯著肌膚如雪万搔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天官帘,我揣著相機(jī)與錄音瞬雹,去河邊找鬼。 笑死刽虹,一個(gè)胖子當(dāng)著我的面吹牛酗捌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涌哲,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼胖缤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了阀圾?” 一聲冷哼從身側(cè)響起哪廓,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎初烘,沒想到半個(gè)月后涡真,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肾筐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年综膀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局齿。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖橄登,靈堂內(nèi)的尸體忽然破棺而出抓歼,到底是詐尸還是另有隱情,我是刑警寧澤拢锹,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布谣妻,位于F島的核電站,受9級(jí)特大地震影響卒稳,放射性物質(zhì)發(fā)生泄漏蹋半。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一充坑、第九天 我趴在偏房一處隱蔽的房頂上張望减江。 院中可真熱鬧,春花似錦捻爷、人聲如沸辈灼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巡莹。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間降宅,已是汗流浹背骂远。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腰根,地道東北人激才。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像唠雕,于是被迫代替她去往敵國和親贸营。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容