STACKJAVA

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:

(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.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

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