Winston: Attempt to write logs with no transports

后端 未结 3 1833
不思量自难忘°
不思量自难忘° 2021-02-20 10:24

I\'m trying to set up an access log and an error log for my express server using Winston, but I seem to be doing something wrong.

Here is my attempt at a config file:

相关标签:
3条回答
  • 2021-02-20 10:25

    I'd try something like this, put all the logger related stuff into a module logger.js:

    logger.js

    var winston = require('winston');
    var path = require('path');
        
    // Set this to whatever, by default the path of the script.
    var logPath = __dirname;
    const tsFormat = () => (new Date().toISOString());
        
    const errorLog = winston.createLogger({
        transports: [
            new winston.transports.File({
                filename: path.join(logPath, 'errors.log'),
                timestamp: tsFormat,
                level: 'info'
            })
        ]
    });
        
    const accessLog = winston.createLogger({
        transports: [
            new winston.transports.File({
                filename: path.join(logPath, 'access.log'),
                timestamp: tsFormat,
                level: 'info'
            })
        ]
    });
          
        
    module.exports = {
        errorLog: errorLog,
        accessLog: accessLog
    };
    

    and then test in index.js:

    index.js

    var logger = require('./logger');
    
    logger.errorLog.info('Test error log');
    logger.accessLog.info('Test access log');
    

    You should see log lines like:

    errors.log:

    {"level":"info","message":"Test access log","timestamp":"2018-03-14T07:51:11.185Z"}
    

    access.log:

    {"level":"info","message":"Test error log","timestamp":"2018-03-14T07:51:11.182Z"}
    

    EDIT

    On Winston version 3.x.x, new (winston.Logger) has been replaced by winston.createLogger (https://github.com/bithavoc/express-winston/issues/175)

    0 讨论(0)
  • 2021-02-20 10:33

    Since you were creating the winston variable in the original code as const winston it wasn't able to add transports and other options in the following lines. The proposed solution moves the similar code into a module but assigns winston variable into var winston.

    0 讨论(0)
  • 2021-02-20 10:45

    1 Logger + console logging for development purpose:

    logger.js

    var logPath = '';
    var log_level = '';
    
    const log = winston.createLogger({
      level: log_level,
      format: winston.format.json(),
      transports: [
        new winston.transports.File({
          filename: path.join(logPath, 'access.log'),
          timestamp: tsFormat,
          level: log_level
        }),
        new winston.transports.File({
          filename: path.join(logPath, 'error.log'),
          timestamp: tsFormat,
          level: 'error'
        }),
      ]
    });
    
    if (process.env.NODE_ENV !== 'production') {
      log.add(new winston.transports.Console({
        format: winston.format.simple()
      }));
    }
    
    module.exports = {
      log: log
    };
    

    app.js

    const logger = require('./logger');
    
    logger.log.info("starting application..");
    
    0 讨论(0)
提交回复
热议问题