Xây dựng bộ logger, xử lý exception tập trung trong NestJS

Tram Ho

Giới thiệu

Trong các ứng dụng Backend việc xây dựng logger và xử lý exception tập trung rất quan trọng cho việc xử lý và điều tra lỗi.
NestJS đã cung cấp sẵn một số module, chúng ta có thể implement tùy ý tùy theo logic mình mong muốn.

Logger

NestJS đã cung cấp sẵn một bộ text-base logger, được sử dụng trong suốt quá trình bootstraping, một số trường hợp khác như hiển thị exception.

Basic

Trong một số trường hợp và tùy vào dự án chúng ta sử dụng một số bộ log khác như Winston:

Bạn có thể tắt, hoặc xác định log level ngay từ quá trình bootstraping ứng dụng

Xác định log level tại thời điểm bootstraping:

Các log level được support: log, error, warn, debug, verbose

Custom

NestJS cung cấp trước class base là LoggerServiceLogger, chúng ta có thể custom lại một số log level.

Ví dụ

Xây dựng log module

DI (Dependency injection)

Như các bạn đã biết, NestJS được xây dựng theo mô hình DDD, project sẽ được chia thành các module nhỏ. Mình sẽ xây dựng một module chuyên xử lý các vấn đề về log, từ đó có thể Inject vào các module khác.

Tạo class LoggerService

Tạo module logger

Application logging

Sau khi xây dựng xong Log Module, để sử dụng chúng ta chỉ cần Inject module vào bất kỳ context, controller nào
Ví dụ Inject logger vào controller

Exception

Sau khi đã xây dựng xong bộ logger, lúc này tiếp đến là phần Exception Handling.
Về cơ bản, tất cả những exception không được catch trong code sẽ được catch tập trung tại layer này

Tại đây mình sẽ phân biệt 2 loại exception chính, đó là Built-in Error và HttpException
Sau khi catch được exception, sẽ tiến hành lấy error message, status code.
Ở đây mình đã inject Logger service vào class AllExceptionFilter, khi catch được exception ngoài repsone về cho phía client thì sẽ tiến hành ghi vào log.

Trên đây mình có vắn tắt lại quá trình xây dựng bộ log và xử lý exception tập trung, chi tiết các bạn có thể tham khảo tại repo:
https://github.com/hoangtm1601/nest-base

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo