Search code examples
javascriptnode.jsloggingdeepstream.io

How do I use Bunyan with Deepstream.io?


According to their documentation (http://deepstream.io/docs/deepstream.html) it says I can change the default logger to my own:

server.set( 'Logger', new FileLogger() );

(Btw, Logger should be logger. When using Logger it throws Error: Unknown option "Logger"). However, I want to use Bunyan as the default logger and I've tried these variants:

var logger = bunyan.createLogger({
  name: "backend",
  streams: streams,
  serializers: {
    row: function (row) {
        if (row) {
            return row;
        }
        return null;
    },
    filename: function (filename) {
        if (filename) {
            return require("path").basename(filename);
        }
        return null;
    }
  }
});

server.set('logger', new logger.info());
server.set('logger', logger.info.bind(console));
server.set('logger', logger.info.bind(logger));
server.set('logger', logger);
server.set('logger', logger.info);

The errors I keep getting is:

TypeError: this._options.logger.log is not a function
  at DependencyInitialiser._onReady (node_modules/deepstream.io/src/utils/dependency-initialiser.js:53:23)
  at new DependencyInitialiser (node_modules/deepstream.io/src/utils/dependency-initialiser.js:25:8)
  at Deepstream.start (node_modules/deepstream.io/src/deepstream.io.js:121:17)
  at Server.<anonymous> (bin/run.js:139:18)
  at Server.g (events.js:260:16)
  at emitNone (events.js:72:20)
  at Server.emit (events.js:166:7)
  at emitListeningNT (net.js:1260:10)
  at doNTCallback1 (node.js:428:9)
  at process._tickDomainCallback (node.js:391:17)

Solution

  • Deepstream expects its logger to implement two methods:

    /**
     * Logs a line
     *
     * @param   {Number} logLevel   One of the C.LOG_LEVEL constants
     * @param   {String} event      One of the C.EVENT constants
     * @param   {String} logMessage Any string
     *
     * @public
     * @returns {void}
     */
    Logger.prototype.log = function( logLevel, event, logMessage ) {};
    
    /**
     * Sets the log-level. This can be called at runtime.
     *
     * @param   {Number} logLevel   One of the C.LOG_LEVEL constants
     *
     * @public
     * @returns {void}
     */
    Logger.prototype.setLogLevel = function( logLevel ) {};
    

    With this, it should be reasonably straightforward to write an adapter for Bunyan. Please also have a look at deepstream's std-out-logger as a reference:

    https://github.com/hoxton-one/deepstream.io/blob/master/src/default-plugins/std-out-logger.js