NestJS Logging 完整指南: 從內建 Logger 到 Winston 整合
本文內容基於 NestJS v10 撰寫,並適用於目前最新版本的 NestJS。Logger 的核心 API 在近期版本中保持穩定。
日誌(Logging)是後端開發中不可或缺的一環。無論是除錯、監控還是追蹤問題,一個設計良好的日誌系統都能讓開發事半功倍。NestJS 內建了一套簡潔的日誌機制,同時也提供了高度彈性讓開發者整合第三方日誌套件。
這篇筆記會從最基礎的內建 Logger 開始,一步步說明如何自定義 Logger,最後介紹如何整合業界常用的 Winston 日誌套件。
NestJS 內建 Logger
NestJS 內建的 Logger 類別位於 @nestjs/common,開箱即用,不需要額外安裝任何套件。它提供了五種日誌等級,並會在終端機以不同顏色呈現。對於大多數的開發場景來說,內建 Logger 已經足夠使用;只有當需要更進階的功能(如寫入檔案、傳送到遠端服務)時,才需要考慮第三方套件。
基本使用方式
在 Service、Controller 或任何地方使用 NestJS 內建 Logger 的方式非常直覺。我們可以在類別中建立一個 private readonly logger 屬性,並在建構時傳入類別名稱作為 context。這個 context 會出現在每條日誌的中括號中,方便開發者快速辨識這條日誌是從哪個模組發出的。
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class UsersService {
private readonly logger = new Logger(UsersService.name);
findAll() {
this.logger.log('正在查詢所有使用者');
// ... 業務邏輯
}
findOne(id: string) {
this.logger.debug(`查詢使用者 ID: ${id}`);
// ...
}
create(dto: CreateUserDto) {
this.logger.warn('這是一個警告訊息');
this.logger.verbose('這是 verbose 層級 的訊息');
}
}
執行後,終端機會顯示類似這樣的輸出(顏色會根據日誌等級不同而變化):
[Nest] 12345 - 12/24/2024, 2:30:00 PM LOG [UsersService] 正在查詢所有使用者
[Nest] 12345 - 12/24/2024, 2:30:00 PM DEBUG [UsersService] 查詢使用者 ID: abc123
[Nest] 12345 - 12/24/2024, 2:30:01 PM WARN [UsersService] 這是一個警告訊息
[Nest] 12345 - 12/24/2024, 2:30:01 PM VERBOSE [UsersService] 這是 verbose 層級的訊息
傳入 Logger 建構子的字串稱為 context,官方慣例是使用 ClassName.name 來取得類別名稱。這樣即使之後重構更改類別名稱,日誌的 context 也會自動跟著變動,不需要手動修改字串。
日誌等級說明
NestJS 內建 Logger 提供五種日誌等級,從最嚴重到最詳細依序為:
| 等級 | 方法 | 用途說明 |
|---|---|---|
error | logger.error() | 錯誤訊息,程式出現問題時使用 |
warn | logger.warn() | 警告訊息,潛在問題但不影響運作 |
log | logger.log() | 一般資訊,重要的業務流程紀錄 |
debug | logger.debug() | 除錯資訊,開發時的詳細資訊 |
verbose | logger.verbose() | 最詳細的資訊,通常用於追蹤問題 |
這邊有一點需要特別注意:NestJS 的日誌等級命名與其他 Logger(如 Winston)略有不同。NestJS 使用 log 而非 info,這是 NestJS 的設計選擇。在後續整合 Winston 時,log 會對應到 Winston 的 info 等級。
error() 方法的特殊用法
error() 方法比較特別,它可以同時傳入錯誤訊息和 stack trace,這在記錄例外時非常實用:
try {
// 可能會拋出例外的操作
await this.dangerousOperation();
} catch (error) {
this.logger.error('操作失敗', error.stack);
}
輸出結果會包含完整的 stack trace,方便追蹤問題:
[Nest] 12345 - 12/24/2024, 2:30:01 PM ERROR [UsersService] 操作失敗
Error: Something went wrong
at UsersService.dangerousOperation (/app/src/users/users.service.ts:25:11)
at UsersService.create (/app/src/users/users.service.ts:18:12)
...