日誌是排查錯誤、追蹤運行參數的利器。雖可用 System.out.println(),但日誌框架提供分級、格式化、多輸出目的地等專業能力。本文示範在無 Spring 的傳統 Java Web 專案中整合 Log4j(Properties 配置 + Servlet 初始化)。
### 根日誌級別與輸出端 ###
log4j.rootLogger = info, stdout, D
### 指定包級別 ###
log4j.logger.com.mucfc = error
### 控制台輸出 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 每日滾動文件輸出 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = F://logs/log.log
log4j.appender.D.Append = false
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
關鍵點:根級別 info,com.mucfc 包單獨設為 error;兩輸出端(控制台 + 文件),文件端閾值 DEBUG 可捕獲所有級別。
public class Log4JInitServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
String log4jLocation = config.getInitParameter("log4j-properties-location");
ServletContext sc = config.getServletContext();
if (log4jLocation == null) {
BasicConfigurator.configure(); // 預設配置
return;
}
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
File file = new File(log4jProp);
if (file.exists()) {
PropertyConfigurator.configure(log4jProp); // 載入指定配置
} else {
BasicConfigurator.configure();
}
super.init(config);
}
}
<servlet>
<servlet-name>Log4JInitServlet</servlet-name>
<servlet-class>com.mucfc.Log4JInitServlet</servlet-class>
<init-param>
<param-name>log4j-properties-location</param-name>
<param-value>log4j.properties</param-value> <!-- 放在 WebContent 根目錄 -->
</init-param>
<load-on-startup>1</load-on-startup> <!-- 專案啟動最先載入 -->
</servlet>
public class MyFirstTest extends HttpServlet {
private static final Logger logger = Logger.getLogger(MyFirstTest.class);
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
logger.info("this is my info message");
logger.debug("this is my debug message");
logger.warn("this is my warn message");
logger.error("this is my error message");
}
}
根據配置,控制台將輸出 info、warn、error 三級;文件因 Threshold=DEBUG 將記錄所有級別。
下篇將介紹 Spring + Log4j 整合,利用 Log4jConfigListener 或 Spring Boot 自動配置進一步簡化。