Code ví dụ Node.js logger – ghi log với module winston.
(Xem thêm: Tự học Node.js qua ví dụ)
Module winston là gì?
Winston là một module, một thư viện thực hiện ghi log trong Node.js.
Nó giúp cho việc ghi log đơn giản và mạnh mẽ hơn với nhiều lựa chọn (log ra file, log ra console), nhiều level (info, warning, error…)
Cài đặt module winston
:
npm install winston
Include module winston vào project node.js:
var winston = require('winston');
Ví dụ:
var winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'info.log', level: 'info' }), new winston.transports.File({ filename: 'debug.log', level: 'debug' }), new winston.transports.File({ filename: 'combined.log' }) ] }); if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); } logger.info('message info'); logger.error('message error'); logger.debug('message debug');
Trong method createLogger:
level: 'info'
: chỉ log lại các log từ info trở lại (tức là chỉ log các message error, warn, info; các message verbose, debug, silly sẽ bị bỏ qua)format: winston.format.json()
: thông tin log sẽ được ghi lại dưới định dạng jsontransports
: định nghĩa đầu ra cho log:-
new winston.transports.File()
: ghi log ra file (các level log trong transports sẽ ghi đè nên level log mặc định){ filename: 'error.log', level: 'error' }
: ghi các message log từ error vào fileerror.log
{ filename: 'info.log', level: 'info' }
: ghi các message info, warn, error ra fileinfo.log
{ filename: 'combined.log' }
: ghi tất cả các thông tin log ra filecombined.log
new winston.transports.Console
: ghi thông tin log ra màn hình console, vì ta chỉ thực hiện xem log trên console khi thực hiện test, nên sẽ kiểm tra nếu không phải là môi trường production thì mới ghi log ra console.
-
(Các level log trong winston theo mức giảm dần: error – warn – info – verbose – debug – silly)
Code ví dụ Node.js ghi log với module winston
Khởi tạo project nodejs-logger
với lệnh npm init -y
Cài đặt module winston
bằng lệnh npm install winston
Cấu trúc project:
Tạo file demo.js
với nội dung sau:
var winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'info.log', level: 'info' }), new winston.transports.File({ filename: 'debug.log', level: 'debug' }), new winston.transports.File({ filename: 'combined.log' }) ] }); if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); } logger.info('message info'); logger.error('message error'); logger.debug('message debug');
Chạy file demo.js
bằng lệnh node demo.js
Các file log được tạo ra:
{"message":"message error","level":"error"}
{"message":"message info","level":"info"} {"message":"message error","level":"error"}
{"message":"message info","level":"info"} {"message":"message error","level":"error"} {"message":"message debug","level":"debug"}
{"message":"message info","level":"info"} {"message":"message error","level":"error"}
Chỗ này các bạn hẳn sẽ băn khoăn tại sao nó vẫn ghi ra file debug.log. Nguyên nhân là chế độ log mặc định là info nên nó sẽ ko log debug message ra console cũng như file combined.log
nhưng ở trong transports ta đang để là ({ filename: 'debug.log', level: 'debug' })
nên nó sẽ thực hiện log ở level debug với file debug.log
Thực tế thì khi làm việc chúng ta sẽ tạo ra file cấu hình log (sẽ khi ra những file nào, level nào …) và export nó ra để sử dụng:
Ví dụ tạo file cấu hình log với winston:
var winston = require('winston'); const logger = winston.createLogger({ level: 'debug', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'info.log', level: 'info' }), new winston.transports.File({ filename: 'debug.log', level: 'debug' }), new winston.transports.File({ filename: 'combined.log' }) ] }); // chỉ ghi log ra console nếu không phải là môi trường production if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); } module.exports = logger;
Khi sử dụng ta chỉ cần import lại biến logger đã export ở trên là được:
var logger = require('./logger'); logger.info('log to file'); logger.error('message error'); logger.debug('message debug');
Khi chạy file index.js
với lệnh node index.js
kết quả sẽ tương tự khi chạy lệnh node demo.js
Code ví dụ Node.js logger – ghi log với module winston
Okay, Done!
Download code ví dụ trên tại đây.
References: