Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase functions: logging with winston in stackdriver console

I cannot make winston logger to write logs to stackdriver console. I deploy my functions as google firebase functions (using firebase deploy). console logging works fine, but we don't use such tool in the project.

What I tried:

  • output to stderr using https://github.com/greglearns/winston-stderr
  • using https://www.npmjs.com/package/@google-cloud/logging-winston (both winston.add(require('@google-cloud/logging-winston')); winston.log('error', 'Winston error!'); and also adding with parameters such as project ID projectId / service account JSON credentials file keyFilename);
  • using https://github.com/findanyemail/winston-transport-stackdriver-error-reporting . Also no luck. I still cannot see logs in stackdriver.

Please suggest... I'm tired of experiments (each re-deploy takes time)

like image 563
Serge Avatar asked Aug 03 '17 08:08

Serge


Video Answer


2 Answers

Finally what I did - implemented custom transport which actually calls console.log under the hood. This helped.

const winston = require('winston');
const util = require('util');
const ClassicConsoleLoggerTransport = winston.transports.CustomLogger = function (options) {
    options = options || {};
    this.name = 'ClassicConsoleLoggerTransport';
    this.level = options.level || 'info';
    // Configure your storage backing as you see fit
};
util.inherits(ClassicConsoleLoggerTransport, winston.Transport);

ClassicConsoleLoggerTransport.prototype.log = function (level, msg, meta, callback) {
    let args = [msg, '---', meta];
    switch (level) {
        case 'verbose':
        case 'debug':
            console.log.apply(null, args);
            break;
        case 'notice':
        case 'info':
            console.info.apply(null, args);
            break;
        case 'warn':
        case 'warning':
            console.warn.apply(null, args);
            break;
        case 'error':
        case 'crit':
        case 'alert':
        case 'emerg':
            console.error.apply(null, args);
            break;
        default:
            console.log.apply(null, args);
    }
    callback(null, true);
};
like image 158
Serge Avatar answered Oct 20 '22 09:10

Serge


Winston's default Console transport fails because it uses console._stdout.write when it's available, which is not accepted by Firebase Functions.

There's now a Google Cloud transport package for Stackdriver you can try. Haven't used it and it requires node ^8.11.2 if you're using Winston 3.

like image 22
Matt Jensen Avatar answered Oct 20 '22 11:10

Matt Jensen