---
# System prepended metadata

title: 無標題
tags: [Nest.js]

---

# NestJS LOG記錄和監控的實踐方式

 提昇NestJS系統的穩運行嗎？🧐 瞭解適用於大型應用的有效日誌記錄和監控策略！🚀
 
 ## 日誌記錄和監控的重要性
 大型 NestJS 系統，需要有效的log日誌記錄和監控功能，能夠藉由記錄及監控分析來追溯或防護：
* 及早檢測 bug 和性能問題。
* 跟蹤各application behavior行為。
* 確保平穩運作並減少停機時間。

LOG記錄為應用程式的日記，將監控視為其運行狀況追蹤。沒有這些，當出現問題時，就只能盲目的查詢Bug。如何保持系統正常運作，下列提供各項最佳實踐方式。

## 1. 使用日誌記錄Logging Library
NestJS 可透過 Logger 類提供內置的記錄系統。雖然它非常適合基本需求，但大型應用程式通常需要更高級的功能，例如日誌持久性、格式化和集中存儲。

範例：
```typescript
import { Logger } from '@nestjs/common';  

@Injectable()  
export class AppService {  
  private readonly logger = new Logger(AppService.name);  

  getHello(): string {  
    this.logger.log('Handling getHello request');  
    return 'Hello World!';  
  }  
}
```

**對於大型應用程式：使用 Winston 或 Pino**
這些庫提供日誌級別、JSON 格式和外部集成等高級功能。
在 NestJS 中設置 Winston
安裝套件：
```bash
npm install winston nest-winston
```
設定 Winston：
```typescript
import { WinstonModule } from 'nest-winston';  
import * as winston from 'winston';  

@Module({  
  imports: [  
    WinstonModule.forRoot({  
      transports: [  
        new winston.transports.Console({  
          format: winston.format.combine(  
            winston.format.timestamp(),  
            winston.format.json(),  
          ),  
        }),  
        new winston.transports.File({ filename: 'logs/app.log' }),  
      ],  
    }),  
  ],  
})  
export class AppModule {}
```

## 2. 使用級別進行記錄
LOG應該講述一個事件。使用有意義的log level級別 （debug、info、warn、error） ，可以能夠針對問題狀況作追縱。

範例：向日誌添加log level
```typescript
this.logger.error('Database connection failed', 'DatabaseService');
```

## 3. Avoid Over-Logging 避免過度記錄
記錄每一個小細節可能會產生無數的日誌檔，會使追查更加困難。請遵循以下提示：
* 僅記錄基本資訊，例如 API 請求、資料庫查詢和錯誤。
* 使用不同的日誌級別，區分開發與運作中的環境與所屬的server。

## 4. 集中日誌
對於大型應用程式，本地日誌檔是不夠的。使用 ELK Stack（Elasticsearch、Logstash、Kibana） 或 LogDNA 等集中式日誌記錄工具。

將 ELK Stack 與 NestJS 集成，使用 Winston 將紀錄發送到 Elasticsearch：
```typescript
import Elasticsearch from 'winston-elasticsearch';  

const esTransport = new Elasticsearch({  
  level: 'info',  
  clientOpts: { node: 'http://localhost:9200' },  
});  

winston.add(esTransport);
```
Elasticsearch可以在 Kibana 中分析和可視化日誌，以獲得更好統計分析。

## 5. 監控運作狀況
監控可確保系統運作狀況。Prometheus、Grafana 或 New Relic 等工具在 NestJS皆可以搭配運作 。
使用 @nestjs/terminus 軟監控系統運行作
```bash
npm install @nestjs/terminus
```

執行狀況檢查：
```typescript
import { TerminusModule } from '@nestjs/terminus';  
import { HttpModule } from '@nestjs/axios';  
import { Module } from '@nestjs/common';  
import { AppController } from './app.controller';  

@Module({  
  imports: [TerminusModule, HttpModule],  
  controllers: [AppController],  
})  
export class AppModule {}
```

使用GET檢查執行狀況：
```typescript
@Controller('health')  
export class AppController {  
  @Get()  
  healthCheck(): string {  
    return 'OK';  
  }  
}
```
## 6. 監控性能指標
使用 APM （Application Performance Monitoring） 工具跟蹤API回應時間、記憶體使用方式和資料庫查詢性能。

APM 工具
* Datadog
* New Relic
* AppSignal

範例：將 Datadog 與 NestJS 結合使用
安裝 Datadog 的 APM 代理：
```bash
npm install dd-trace
```
main.ts系統初始化設定：
```typescript
import 'dd-trace/init';  
import { NestFactory } from '@nestjs/core';  
import { AppModule } from './app.module';  

async function bootstrap() {  
  const app = await NestFactory.create(AppModule);  
  await app.listen(3000);  
}  
bootstrap();
```


## 7. 警告通知 Alerts and Notifications
設置Alerts以通知您的團隊有關關鍵問題的資訊。例如：
* 使用 Slack 或 PagerDuty 獲取即時錯誤Alerts。
* 配置 AWS CloudWatch 以接收自動通知。
範例：使用 Slack 發送警報
使用類似 node-slack-sdk 的庫將日誌警報發送到 Slack 通道。
```typescript
import { WebClient } from '@slack/web-api';  

const slack = new WebClient('SLACK_TOKEN');  

slack.chat.postMessage({  
  channel: '#alerts',  
  text: 'Critical error in production!',  
});
```
## 8. 持續改進日誌記錄和監控
定期查看日誌和監控控制面板：
* 要刪除的冗長和無用的日誌。
* 依class level作風險評估。

## 結論
有效的日誌記錄和監控是任何大型 NestJS 系統需俱備的功能。可以及早發現錯誤，還可以確保系統應用程式在server環境的性能。通過遵循上述做法（例如使用高級日誌記錄工具、監控運行狀況和性能以及集中日誌），可以讓系統應用程式更加健壯、可擴展且更易於維護。

>出處來源：
>https://medium.com/@mohantaankit2002/best-practices-for-logging-and-monitoring-in-large-nestjs-applications-ae6e2ed31d93