initializers/logger.js

'use strict'

const winston = require('winston')
const ActionHero = require('./../index.js')
const api = ActionHero.api

module.exports = class Logger extends ActionHero.Initializer {
  constructor () {
    super()
    this.name = 'logger'
    this.loadPriority = 100
  }

  initialize () {
    let transports = []
    let i

    for (i in api.config.logger.transports) {
      let t = api.config.logger.transports[i]
      if (typeof t === 'function') {
        transports.push(t(api, winston))
      } else {
        transports.push(t)
      }
    }

    api.logger = new (winston.Logger)({transports: transports})

    if (api.config.logger.levels) {
      api.logger.setLevels(api.config.logger.levels)
    } else {
      api.logger.setLevels(winston.config.syslog.levels)
    }

    if (api.config.logger.colors) {
      winston.addColors(api.config.logger.colors)
    }

    /**
     * Log a message, with optional metadata.  The message can be logged to a number of locations (stdio, files, etc) as configured via config/logger.js
     * The default log levels are: `0=debug` `1=info` `2=notice` `3=warning` `4=error` `5=crit` `6=alert` `7=emerg`
     *
     * @memberof api
     * @param  {string} message  The message to log.
     * @param  {string} severity (optional) What log-level should this message be logged at. Default: 'info'.
     * @param  {Object} data     (optional) Any object you wish to append to this message.
     * @see https://github.com/winstonjs/winston
     *
     * @example
// the most basic use.  Will assume 'info' as the severity
api.log('hello');

// custom severity
api.log('OH NO!', 'warning');

// custom severity with a metadata object
api.log('OH NO, something went wrong', 'warning', { error: new Error('things are busted') });
     */
    api.log = (message, severity, data) => {
      if (severity === undefined || severity === null || api.logger.levels[severity] === undefined) { severity = 'info' }
      let args = [severity, message]
      if (data !== null && data !== undefined) { args.push(data) }
      api.logger.log.apply(api.logger, args)
    }

    let logLevels = []
    for (i in api.logger.levels) { logLevels.push(i) }

    api.log('Logger loaded.  Possible levels include:', 'debug', logLevels)
  }
}