系統上線後,控制台日誌易丟失、難檢索。輕量級 Log 工具類:捕獲 Exception → 組裝時間戳、自定標籤、完整堆疊追蹤 → 追加寫入專案根目錄 log.txt。無第三方依賴,適合中小專案快速接入。
System.getProperty("user.dir") → 父目錄 → log.txt。yyyy-MM-dd:HH:mm:ss、業務標識 youName、異常 toString()、完整 printStackTrace(PrintWriter)。new FileWriter(file, true) 保留歷史紀錄。flush() + close() 在 finally 隱含保證(範例結構已確保)。public class Log {
public void saveLog(Exception e, String tag) {
try {
File logFile = new File(System.getProperty("user.dir"), "log.txt");
try (PrintWriter pw = new PrintWriter(new FileWriter(logFile, true))) {
pw.println(); // 換行分隔
pw.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " [" + tag + "]");
pw.println("************************* " + e + " *************************");
e.printStackTrace(pw); // 關鍵:將堆疊寫入檔案而非控制台
}
} catch (Exception ex) {
ex.printStackTrace(); // 最後防線:寫檔失敗至少印控制台
}
}
}
try {
riskyOperation();
} catch (Exception e) {
new Log().saveLog(e, "OrderService#createOrder");
// 可選:拋出業務異常、返回錯誤碼、發送告警
}
| 階段 | 方案 | 關鍵能力 |
|---|---|---|
| 手工 | 自寫 PrintWriter | 零依賴、極簡 |
| 門面 | SLF4J + Logback/Log4j2 | 等級控制、滾動檔案、非同步、結構化 JSON |
| 雲原生 | ELK/EFK、Loki、SkyWalking | 集中收集、全文檢索、鏈路追蹤、告警儀表板 |
新專案直接引入 spring-boot-starter-logging(內含 Logback),配置 logback-spring.xml 即可獲得生產級能力。舊專案可先用 SLF4J 門面包裝現有 Log 類,再漸進替換底層實作。