last_seen_404
last_seen_404

Reputation: 202

Meta is null in Winston-mongodb

I am using winston-mongodb modlue to log the request response.

Logger.service.ts

const options = {
    console: {
        db: DB_URL,
        level: 'info',
        format: format.combine(format.timestamp(), format.json()),
        collection: 'logs',
    },
    error: {
        db: DB_URL,
        level: 'error',
        format: format.combine(format.timestamp(), format.json()),
        collection: 'logs',
    }
  };

const logger = createLogger({
    transports: [
        new MongoDB(options.console),
        new MongoDB(options.error)
    ],
});

Server.ts

server.listen(port, () => {
    logger.info({message:`Server is up and running on port ${port}`, meta: {
        myProp: 'foo'
      }});
   );

Result:

{
    "_id" : ObjectId("5ed8bd2c726d273004b082ca"),
    "timestamp" : ISODate("2020-06-04T09:21:48.835Z"),
    "level" : "info",
    "message" : "Server is up and running on port 4000 HI",
    **"meta" : null**
}

I am trying to add meta data to logger. But it is adding null to the result.

Upvotes: 0

Views: 3170

Answers (5)

Harvel Kay
Harvel Kay

Reputation: 1


apparently i had the same problem where the meta property in mongoDB transport was null: This is how i fixed it....

const winston = require("winston")
const { format } = require("winstone")

winstone.add(new 
winstone.transports.MongoDB({
format:format.metadata()})

Upvotes: 0

Timbokun
Timbokun

Reputation: 301

OR another way, if you are exporting the function as error middleware (using nodejs, express):

module.exports = function (err, req, res, next) {
  logger.log({
    level: "error",
    message: err.message,
    stack: err.stack,
    metadata: err.stack, // Put what you like as meta
  });
  res.status(500).send("Uncaught error caught here.");
};

Upvotes: 1

Youssef
Youssef

Reputation: 3114

To get err object stored in the meta (with all its javascript properties), you need to specify :

format.metadata()    

In the createLogger call.

Here is a working sample code:

   // Declare winston
    const winston = require("winston");
    // Import all needed using Object Destructuring
    const { createLogger, format, transports } = require("winston");
    const { combine, timestamp, printf } = format;
    // Export the module
    module.exports = function (err, req, res, next) {
      const logger = createLogger({
        level: "error",
        format: combine(
          format.errors({ stack: true }), // log the full stack
          timestamp(), // get the time stamp part of the full log message
          printf(({ level, message, timestamp, stack }) => {
            // formating the log outcome to show/store
            return `${timestamp} ${level}: ${message} - ${stack}`;
          }),
          format.metadata() // >>>> ADD THIS LINE TO STORE the ERR OBJECT IN META field
        ),
        transports: [
          new transports.Console(), // show the full stack error on the console
          new winston.transports.File({
            // log full stack error on the file
            filename: "logfile.log",
            format: format.combine(
              format.colorize({
                all: false,
              })
            ),
          }),
          new winston.transports.MongoDB({
            db: "mongodb://localhost/logdb",
            // collection: "log",
            level: "error",
            storeHost: true,
            capped: true,
            // metaKey: 'meta'
          }),
        ],
      });
    
      logger.log({
        level: "error",
        message: err,
      });
      // Response sent to client but nothing related to winston
      res.status(500).json(err.message);
    };

Upvotes: 7

Himanshu Prajapati
Himanshu Prajapati

Reputation: 1

Specify metadata object explicitly:

logger.error(err.message, {metadata: err.stack});

Upvotes: 0

Rakyesh Kadadas
Rakyesh Kadadas

Reputation: 941

try this

// create new meta object to store in database
    let logMeta={
        stack: err.stack,                       // error stack
        otherInfo: otherInfoData                            // any other info you want to store
    }

// use metadata propery for meta
    logger.error(err.message, {metadata: logMeta });

Upvotes: 3

Related Questions