在企業級應用中,常需將不同業務模組(如註冊、登入、支付)的日誌分離存放,並依日期自動產生新檔案,方便追蹤與維運。本文示範如何透過 log4j.properties 達成「模組隔離」與「每日滾動」兩大目標。
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
</dependencies>
log4j.properties# 根 Logger,輸出至 Console
log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p:%d{yyyyMMdd HH:mm:ss} %c: %m%n
# 共用日誌目錄
logdir=/var/logs/myapp
# ---------- 註冊模組 ----------
log4j.logger.register=INFO, register
log4j.appender.register=org.apache.log4j.DailyRollingFileAppender
log4j.appender.register.File=${logdir}/register.log
log4j.appender.register.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.register.layout=org.apache.log4j.PatternLayout
log4j.appender.register.layout.ConversionPattern=%d %p [%c %L %l] - %m%n
# additivity=false 表示不向父 Logger (root) 傳遞,避免重複輸出
log4j.additivity.register=false
# ---------- 登入模組 ----------
log4j.logger.login=INFO, login
log4j.appender.login=org.apache.log4j.DailyRollingFileAppender
log4j.appender.login.File=${logdir}/login.log
log4j.appender.login.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.login.layout=org.apache.log4j.PatternLayout
log4j.appender.login.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.additivity.login=false
# ---------- 第三方套件噪音控制 ----------
log4j.logger.org.springframework=ERROR
log4j.logger.com.mchange=ERROR
log4j.logger.org.apache.http=ERROR
| 屬性 | 說明 |
|---|---|
log4j.logger.<模組名> | 定義該模組的 Logger 名稱與等級,後接自訂 Appender 名稱(如 register)。 |
log4j.appender.<名稱>.DatePattern | 控制滾動頻率。'_'yyyy-MM-dd'.log' 表示每天午夜產生 register_2024-05-20.log。 |
log4j.additivity.<模組名> | 設為 false 可阻斷日誌向根 Logger 傳遞,實現完全隔離。 |
import org.apache.log4j.Logger;
public class BizLogger {
private static final Logger REGISTER_LOG = Logger.getLogger("register");
private static final Logger LOGIN_LOG = Logger.getLogger("login");
public static void logRegister(String msg) {
REGISTER_LOG.info(msg);
}
public static void logLogin(String msg) {
LOGIN_LOG.info(msg);
}
}
/var/logs/myapp/register_2024-05-20.log 僅含註冊業務日誌。/var/logs/myapp/login_2024-05-20.log 僅含登入業務日誌。善用 DailyRollingFileAppender 搭配 additivity=false,即可輕鬆打造模組化、自動分檔的日誌系統,大幅提升問題排查效率。