/** * 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