
Morgan Logger: Thám Tử Đắc Lực Của Server Node.js
Chào các chiến thần Gen Z của anh Creyt! Hôm nay, chúng ta sẽ cùng nhau khám phá một "thám tử" cực kỳ đắc lực trong thế giới Node.js/Express, đó chính là Morgan Logger. Nghe tên có vẻ "ngầu lòi" đúng không? Đảm bảo sau buổi này, các em sẽ "flex" được ngay là mình đã biến server thành một cuốn nhật ký siêu chi tiết, không sót một "drama" nào!
Morgan Logger là gì mà "chill" thế?
Thử tưởng tượng thế này nhé: Server Node.js của các em như một quán cà phê đông đúc. Khách ra vào tấp nập, gọi món này món kia. Nếu không có ai ghi chép lại, làm sao các em biết được ai vào, gọi gì, bao lâu thì đi, có món nào bị phàn nàn không? Chắc chắn là loạn xì ngầu!
Morgan Logger chính là cái "anh quản lý sổ sách" siêu tỉ mỉ đó. Nó là một middleware (nhớ khái niệm middleware anh đã giảng chưa? Như một người gác cổng kiểm tra mọi thứ trước khi cho vào nhà vậy) dành cho Express.js, chuyên trách nhiệm vụ ghi lại (log) mọi request HTTP gửi đến server của các em.
Nói cách khác, mỗi khi có một "khách hàng" (request) gõ cửa server, Morgan sẽ chụp lại một tấm ảnh "thẻ căn cước" của request đó: nó đến từ đâu (IP), vào lúc nào, dùng phương thức gì (GET, POST, PUT, DELETE), đường dẫn là gì, trạng thái trả về ra sao (thành công 200 OK hay lỗi 404 Not Found), và thậm chí cả thời gian xử lý request đó mất bao lâu. Tất cả đều được ghi lại cẩn thận vào "cuốn sổ nhật ký" của server, hay chính là console (hoặc file log) của các em.
Để làm gì á? Quá nhiều thứ luôn!
- Debug thần sầu: Khi code bị lỗi, thay vì mò kim đáy bể, các em có thể nhìn vào log của Morgan để biết chính xác request nào đã gây ra lỗi, data gửi lên có đúng không, server phản hồi thế nào. Nó như một cái camera giám sát giúp các em tua lại "hiện trường" vậy.
- Theo dõi hiệu năng: Biết được mỗi request mất bao lâu để xử lý giúp các em tối ưu hóa code, tìm ra những chỗ "nghẽn cổ chai" làm chậm server.
- Phân tích hành vi người dùng (cơ bản): Dù không chi tiết bằng các công cụ analytics chuyên dụng, nhưng việc biết request nào được gọi nhiều nhất, từ những IP nào, cũng cho các em cái nhìn tổng quan về cách người dùng tương tác với ứng dụng.
- Bảo mật: Phát hiện các request đáng ngờ, các cuộc tấn công DDoS cơ bản bằng cách theo dõi tần suất và loại request.
Code Ví Dụ Minh Hoạ: Bắt tay vào "thực chiến"!
Đầu tiên, các em cần cài đặt Morgan và Express (nếu chưa có):
npm install express morgan
Sau đó, hãy cùng xem một ví dụ đơn giản để thấy Morgan hoạt động như thế nào:
const express = require('express');
const morgan = require('morgan');
const app = express();
const port = 3000;
// Bước 1: Kích hoạt Morgan Logger
// 'dev' là một trong những định dạng log có sẵn của Morgan, rất tiện cho môi trường phát triển
app.use(morgan('dev'));
// Định nghĩa một vài route đơn giản
app.get('/', (req, res) => {
res.send('Chào mừng đến với server của Creyt! Trang chủ đây!');
});
app.get('/users', (req, res) => {
console.log('Đang xử lý request /users...');
res.json([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]);
});
app.post('/products', (req, res) => {
console.log('Có request POST đến /products');
res.status(201).send('Sản phẩm đã được tạo thành công!');
});
// Server bắt đầu lắng nghe
app.listen(port, () => {
console.log(`Server của Creyt đang chạy ở http://localhost:${port}`);
});
Cách chạy:
- Lưu code trên vào file
app.js. - Mở terminal, chạy
node app.js. - Mở trình duyệt hoặc Postman, truy cập
http://localhost:3000/rồihttp://localhost:3000/users. - Thử gửi một request POST đến
http://localhost:3000/productsbằng Postman hoặccurl.
Các em sẽ thấy những dòng log xuất hiện trên terminal tương tự như thế này (khi dùng format dev):
GET / 304 - 2.872 ms
GET /users 200 42 - 1.096 ms
POST /products 201 29 - 0.789 ms
Hiểu chứ? Mỗi dòng là một "câu chuyện" của một request: phương thức (GET/POST), đường dẫn, trạng thái HTTP (200, 304, 201), dung lượng response, và thời gian xử lý.

Mẹo (Best Practices) để ghi nhớ và dùng thực tế
Với một "thám tử" như Morgan, chúng ta cần biết cách dùng nó hiệu quả nhất để không bị "ngập lụt" trong thông tin mà vẫn tìm ra được "manh mối" cần thiết:
-
Chọn "trang phục" phù hợp (Format): Morgan có nhiều "bộ cánh" (format) khác nhau:
'dev': Dành cho môi trường phát triển (development). Nó nhiều màu sắc, rất dễ đọc và cung cấp đủ thông tin cần thiết. Như ở ví dụ trên.'tiny','short','common','combined': Cung cấp các mức độ chi tiết khác nhau.combinedthường được dùng cho production vì nó ghi lại nhiều thông tin hơn, hữu ích cho phân tích sau này.- Mẹo: Để nhớ,
devlà để "dev",combinedlà để "production" (vì nó "kết hợp" nhiều thông tin hơn).
-
"Cuốn nhật ký" không giới hạn (Lưu log vào file): Console thì tiện thật, nhưng nếu server chạy lâu hoặc gặp lỗi, log sẽ bị trôi đi mất. Hãy hướng Morgan ghi log vào một file để lưu trữ lâu dài. Đây là "real deal" khi deploy ứng dụng:
const fs = require('fs'); const path = require('path'); // Tạo một stream để ghi log vào file access.log const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' }); // Sử dụng Morgan với format 'combined' và stream là file access.log app.use(morgan('combined', { stream: accessLogStream })); // Log ra console luôn (tùy chọn) app.use(morgan('dev'));Với cách này, các em vừa có log trên console khi dev, vừa có log lưu vào file khi chạy production. "Hai mũi tên trúng hai đích"!
-
"Đo ni đóng giày" (Custom Format): Các em muốn log thêm thông tin riêng của ứng dụng, ví dụ như ID của user đang login? Morgan cho phép tạo custom token và custom format. Điều này cực kỳ mạnh mẽ!
// Tạo một token tùy chỉnh để log User ID (ví dụ: lấy từ req.user.id sau khi authenticate) morgan.token('user-id', function (req, res) { // Giả sử req.user tồn tại sau khi authenticate return req.user ? req.user.id : 'anonymous'; }); // Sử dụng custom format app.use(morgan(':method :url :status :response-time ms - user-id::user-id'));Với cách này, log của các em sẽ bao gồm cả user ID, giúp việc debug và theo dõi trở nên siêu chi tiết.
-
"Đội hình siêu cấp" (Kết hợp với các Logger khác): Morgan rất tốt cho HTTP requests, nhưng nếu muốn log các sự kiện khác trong ứng dụng (ví dụ: lỗi database, thông báo quan trọng), các em nên kết hợp với các thư viện logger mạnh mẽ hơn như
WinstonhoặcPino. Chúng sẽ giúp các em quản lý log một cách chuyên nghiệp hơn, có thể gửi log đến các dịch vụ lưu trữ tập trung (như ELK stack, Splunk). -
"Bảo mật thông tin" (Cẩn thận với dữ liệu nhạy cảm): Đừng bao giờ log trực tiếp các thông tin nhạy cảm như mật khẩu, token API, thông tin thẻ tín dụng vào log. Kẻ xấu có thể lợi dụng để đánh cắp thông tin. Hãy luôn lọc bỏ hoặc che giấu các trường dữ liệu này trước khi ghi vào log.
Ứng dụng thực tế: "Ai đã dùng Morgan?"
Hầu hết mọi ứng dụng web sử dụng Node.js và Express đều ít nhiều sử dụng Morgan (hoặc một logger tương tự). Từ các startup nhỏ đến các công ty lớn, Morgan là một công cụ không thể thiếu để duy trì sự ổn định và hiệu quả của server.
- Các trang thương mại điện tử: Theo dõi các yêu cầu thêm sản phẩm vào giỏ hàng, thanh toán, xử lý đơn hàng.
- Các API backend: Giám sát các cuộc gọi API từ ứng dụng di động hoặc frontend, đảm bảo các endpoint hoạt động đúng đắn.
- Các nền tảng mạng xã hội: Theo dõi các hoạt động đăng bài, bình luận, tương tác của người dùng để phát hiện các vấn đề tiềm ẩn.
Nói chung, bất cứ nơi nào có server Express, ở đó có thể có Morgan đang âm thầm làm nhiệm vụ "ghi chép" của mình.
Thử nghiệm và hướng dẫn nên dùng cho case nào
Anh Creyt từng có lần debug một lỗi "lạ" mà chỉ xảy ra trên môi trường production. Không có Morgan, anh đã phải mất cả ngày trời mò mẫm. Nhưng khi bật Morgan với combined format và lưu vào file, anh chỉ mất vài phút để tìm ra rằng đó là do một request gửi thiếu header Authorization. Morgan đã ghi rõ ràng 401 Unauthorized và thiếu thông tin header trong log.
Khi nào nên dùng Morgan?
- Debug "khẩn cấp": Khi có lỗi khó hiểu và cần nhìn rõ luồng request/response.
- Giám sát hiệu suất "real-time": Xem request nào mất nhiều thời gian nhất để xử lý.
- Phân tích hành vi "sơ bộ": Hiểu được tổng quan các request đến server.
- Kiểm tra bảo mật: Phát hiện các request đáng ngờ, ví dụ như quá nhiều request từ cùng một IP trong thời gian ngắn (có thể là tấn công DDoS hoặc brute-force).
Thử nghiệm ngay và luôn:
- Chạy server với các format khác nhau: Tự mình thay đổi
app.use(morgan('dev'))thànhapp.use(morgan('tiny')),app.use(morgan('combined'))và quan sát sự khác biệt trong console. Các em sẽ hiểu rõ hơn về từng loại format. - Gửi đủ loại request: Dùng Postman hoặc curl để gửi GET, POST, PUT, DELETE đến các endpoint khác nhau, cả những endpoint không tồn tại (để tạo lỗi 404). Quan sát Morgan ghi lại chúng như thế nào.
- Tạo custom token của riêng mình: Hãy thử tạo một token để log thêm một thông tin nào đó mà các em nghĩ là quan trọng cho ứng dụng của mình (ví dụ: tên ứng dụng, phiên bản API).
Nhớ nhé, Morgan không chỉ là một công cụ, nó là đôi mắt và đôi tai của các em trong thế giới server. Nắm vững nó, các em sẽ kiểm soát được "câu chuyện" của ứng dụng mình một cách chủ động và hiệu quả hơn rất nhiều. Cứ "chill" mà học, có gì khó cứ hỏi anh Creyt!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!