# logger.js

    /**
     * A logger backed by [bunyan](https://github.com/trentm/node-bunyan)
     *
     * The default log level is `info`, but you can change it by setting the
     * `LOG_LEVEL` environment variable to `trace`, `debug`, `info`, `warn`,
     * `error`, or `fatal`.
     *
     * By default, logs are formatted for readability in development. If you intend
     * to drain logs to a logging service, set `LOG_FORMAT=json`.
     *
     * **Note**: All execptions reported with `logger.error` will be forwarded to
     * [sentry](https://github.com/getsentry/sentry) if the `SENTRY_DSN` environment
     * variable is set.
     *
     * @typedef logger
     *
     * @example
     *
     * robot.log("This is an info message");
     * robot.log.debug("…so is this");
     * robot.log.trace("Now we're talking");
     * robot.log.info("I thought you should know…");
     * robot.log.warn("Woah there");
     * robot.log.error("ETOOMANYLOGS");
     * robot.log.fatal("Goodbye, cruel world!");
     */

    const Logger = require('bunyan')
    const bunyanFormat = require('bunyan-format')
    const serializers = require('./serializers')

    // Return a function that defaults to "info" level, and has properties for
    // other levels:
    //
    //     robot.log("info")
    //     robot.log.trace("verbose details");
    //
    Logger.prototype.wrap = function () {
      const fn = this.info.bind(this);

      // Add level methods on the logger
      ['trace', 'debug', 'info', 'warn', 'error', 'fatal'].forEach(level => {
        fn[level] = this[level].bind(this)
      })

      // Expose `child` method for creating new wrapped loggers
      fn.child = (attrs) => {
        // Bunyan doesn't allow you to overwrite name…
        const name = attrs.name
        delete attrs.name
        const log = this.child(attrs, true)

        // …Sorry, bunyan, doing it anwyway
        if (name) log.fields.name = name

        return log.wrap()
      }

      // Expose target logger
      fn.target = logger

      return fn
    }

    const logger = new Logger({
      name: 'probot',
      level: process.env.LOG_LEVEL || 'info',
      stream: bunyanFormat({outputMode: process.env.LOG_FORMAT || 'short'}),
      serializers
    })

    module.exports = logger