Code ví dụ Node.js logger – ghi log với module winston

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 json
  • transports: đị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 file error.log
      • { filename: 'info.log', level: 'info' }: ghi các message info, warn, error ra file info.log
      • { filename: 'combined.log' }: ghi tất cả các thông tin log ra file combined.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

Code ví dụ Node.js logger - ghi log với module winston

Cài đặt module winston bằng lệnh npm install winston

Code ví dụ Node.js logger - ghi log với module winston

Cấu trúc project:

Code ví dụ Node.js logger - ghi log với module winston

Tạo file demo.jsvớ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

Code ví dụ Node.js logger - ghi log với module winston

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:

https://www.npmjs.com/package/winston

stackjava.com