1. 程式人生 > >如何使用Tomcat自帶的日誌實現tomcat-juli.jar

如何使用Tomcat自帶的日誌實現tomcat-juli.jar

class ace seve 不能 參考 fin epo prop vnr

前言

Tomcat自帶的日誌實現是tomcat-juli.jar,它是對默認的JDK日誌java.util.logging進行一定的封裝,和標準JDK日誌支持相同的配置,但是和log4j等常用的日誌框架比起來功能要較為簡陋。但是tomcat-juli可以針對不同的classloader來使用不同的配置文件,使得tomcat下不同的Web應用程序可以使用各自獨立的日誌文件。

如果我們想在代碼中使用Tomcat自帶的日誌實現,也很簡單,首先拿到tomcat-juli.jar。該jar包存在於Tomcat安裝目錄下的lib下,或者你可以直接在Maven倉庫裏選擇你想要的版本去下載。

接著新建一個java項目,導入該jar包,然後在根目錄下新建一個配置文件logging.properties

配置文件logging.properties

tomcat-juli使用的配置文件是logging.properties,一個簡單的配置如下:

handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.lewis.test.TestLewis.level = SEVERE

這裏簡單解釋下,第一行表示使用ConsoleHandler來處理打印日誌,用來將信息打印到控制臺。
第二行表示輸出的日誌級別是INFO,可以在level前加上任意類名或者完整的包名,用於精準控制類/包的日誌級別,譬如第三行。
第四行表示輸出的日誌信息日期格式。

更多具體的配置可以去看看Tomcat的conf目錄下的logging.properties,裏邊有很多配置和註釋。

另外提一下,tomcat-juli的日誌級別和log4j等是不一樣的,其級別如下:

SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)

測試類

測試類的代碼如下:

package com.lewis.test;

import java.io.NotSerializableException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class TestLewis {

private static Logger LOGGER;

static {
System.setProperty("java.util.logging.config.file",
"D:\\lewis\\workspace\\test\\src\\main\\resources\\logging.properties");
//must initialize loggers after setting above property
LOGGER = Logger.getLogger(TestLewis.class.getName());
}

public static void main(final String[] args) {

System.out.println("----System.out----");
System.err.println("----System.err----");

LOGGER.info("an info msg");
LOGGER.warning("a warning msg");
LOGGER.severe("a severe msg");

LOGGER.log(Level.INFO, "test1: a info msg", new NotSerializableException());
LOGGER.log(Level.WARNING, "test1: a warning msg", new NotSerializableException());
LOGGER.log(Level.SEVERE, "test1: a severe msg", new NotSerializableException());

}

這裏需要註意的是,tomcat-juli的打印語句也是不太一樣的,如果需要打印出具體的堆棧信息就必須自己指定日誌級別,如果使用自帶的日誌級別打印語句諸如.info()等,只能打印出字符串,不能打印出堆棧信息。

還有就是必須在代碼的一開始就指定加載配置文件,通過System.setProperty("java.util.logging.config.file", "配置文件的路徑");。如果沒有這一步,你會發現你的配置文件根本沒有效果。如果你去Tomcat的bin目錄下的catalina.bat可以發現,裏邊也是配置了這個參數:

set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"

輸出結果

控制臺輸出如下:

----System.out----
----System.err----
Dec 07, 2018 5:56:04 PM com.lewis.test.TestLewis main
SEVERE: a severe msg
Dec 07, 2018 5:56:05 PM com.lewis.test.TestLewis main
SEVERE: test1: a severe msg
java.io.NotSerializableException
        at com.lewis.test.TestLewis.main(TestLewis.java:75)

參考鏈接

  • Java Util Logging - Loading logging.properties
  • Tomcat日誌系統詳解

如何使用Tomcat自帶的日誌實現tomcat-juli.jar