Category: 08. Winston

https://www.americanstandard.com.vn/webassets/images/icon-view-3d.jpg

  • Querying Logs

    If you’re logging to a database or an external service, querying logs can be useful. For instance, with MongoDB and winston-mongodb, you can query logs like this:

    const winston = require('winston');
    require('winston-mongodb');
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.combine(
    
    winston.format.timestamp(),
    winston.format.json()
    ), transports: [
    new winston.transports.MongoDB({
      db: 'mongodb://localhost/logs',
      collection: 'log',
      level: 'info'
    })
    ] }); // Querying logs from MongoDB const MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost/logs', function (err, client) { if (err) throw err; const db = client.db('logs'); const collection = db.collection('log'); collection.find({ level: 'info' }).toArray(function (err, docs) {
    if (err) throw err;
    console.log(docs);
    client.close();
    }); });
  • Log Rotation

    For managing log file sizes and rotation, you can use the winston-daily-rotate-file transport. Install it first:

    npm install winston-daily-rotate-file
    

    Then configure it like so:

    const winston = require('winston');
    require('winston-daily-rotate-file');
    
    const transport = new winston.transports.DailyRotateFile({
      filename: 'application-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxSize: '20m',
      maxFiles: '14d',
      level: 'info',
      format: winston.format.combine(
    
    winston.format.timestamp(),
    winston.format.json()
    ) }); const logger = winston.createLogger({ level: 'info', transports: [transport] }); logger.info('This message will be logged to a daily rotated file');
  • Custom Transports

    Winston supports creating custom transports to log messages in unique ways. Here’s a basic example of a custom transport:

    const { TransportStreamOptions } = require('winston-transport');
    
    class CustomTransport extends TransportStreamOptions {
      constructor(options) {
    
    super(options);
    this.level = options.level || 'info';
    } log(info, callback) {
    setImmediate(() => this.emit('logged', info));
    console.log(${info.level}: ${info.message});
    if (callback) callback();
    } } const logger = winston.createLogger({ level: 'info', format: winston.format.simple(), transports: [
    new CustomTransport({ level: 'info' })
    ] }); logger.info('This is a custom transport log message');
  • Handling Exceptions

    Winston can handle uncaught exceptions and unhandled rejections.

    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.combine(
    
    winston.format.timestamp(),
    winston.format.json()
    ), transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'combined.log' })
    ], exceptionHandlers: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'exceptions.log' })
    ] }); process.on('unhandledRejection', (ex) => { throw ex; });
  • Multiple Transports

    You can send logs to multiple destinations. For example, you might want to log errors to a file and info messages to the console.

    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.combine(
    
    winston.format.timestamp(),
    winston.format.json()
    ), transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
    ] });
  • Customizing Formats

    Winston provides several formats to structure your logs. You can also create custom formats.

    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.combine(
    
    winston.format.timestamp(),
    winston.format.json()
    ), transports: [
    new winston.transports.Console()
    ] });

    This example combines a timestamp and JSON format.

  • Log Levels

    Winston uses different log levels. By default, they are:

    • error
    • warn
    • info
    • http
    • verbose
    • debug
    • silly

    You can configure the level of logging you want. For example, if you only want to log info and above, you set the level to info.

    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
    
    new winston.transports.Console()
    ] });
  • Basic Usage

    Here’s a simple example to get you started:

    const winston = require('winston');
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.simple(),
      transports: [
    
    new winston.transports.Console()
    ] }); logger.info('This is an info message'); logger.error('This is an error message');
  • Basic Usage

    Here’s a simple example to get you started:

    const winston = require('winston');
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.simple(),
      transports: [
    
    new winston.transports.Console()
    ] }); logger.info('This is an info message'); logger.error('This is an error message');
  • Installation

    First, you need to install Winston via npm. Open your terminal and run:

    npm install winston