Prasad Kanaparthi
Prasad Kanaparthi

Reputation: 6563

How to pass winston logger object to Shared models in Loopback3

I'm using Loopback3 and trying to log message for shared model that are outside of project folder. My project folder structure looks like below

myproj\server\logger.js   // using winston logger here
myProj\common\models\     // I've couple of models here and able to use above logger

Also, I've few more models outside myproj folder (../../shared/models). Below is my server\model-config.json

"sources": [
  "loopback/common/models",
  "loopback/server/models",
  "../common/models",
  "../../shared/models",  // Shared models
  "./models"
],

And Person is in shared models folder. How can i pass logger object to this.

module.exports = function(Person){

Person.greet = async function(msg) {
    logger.info("received message: " + msg);  // How to get here above winston logger object ?
    console.log("received message: " + msg);
    return 'Greetings... ' + msg;
}

Person.remoteMethod('greet', {
      accepts: {arg: 'msg', type: 'string'},
      returns: {arg: 'greeting', type: 'string'}
});

};

Upvotes: 0

Views: 328

Answers (2)

Ketan Patil
Ketan Patil

Reputation: 1272

It can be somewhat messy when you have your loopback models spread across multiple directories or even repositories. Its always a good practice to console common parts like logger, validation, utils etc from a static global reference, attached to loopback instance object. This loopback instance object is present as a reference to all its models. The way I would solve this problem is...

  1. Add a new boot script in your loopback3 project and attach instance of logger class to loopback's app instance.
'use strict';

const { logger } = require("./logger");

module.exports = function (app) {
  app.logger = logger;
};
  1. Now wherever needed, you can simply access it from the app reference present on the model.
Person.greet = async function(msg) {
 Person.app.logger.info("received message: " + msg);
 return 'Greetings... ' + msg;
}

Upvotes: 1

Prasad Kanaparthi
Prasad Kanaparthi

Reputation: 6563

I did like below

in server\server.js

const {logger} = require("./logger");

app.start = function() {
return app.listen(function() {
    app.emit('started');
    :
    :
    app.models.Person.logger = logger;   // Adding new property to Person model
  });
};

in Person model

Person.greet = async function(msg) {
 Person.logger.info("received message: " + msg); // using logger object like this
 this.logger.info("received message: " + msg);   // or like this      
 console.log("received message: " + msg);
 return 'Greetings... ' + msg;
}

Upvotes: 0

Related Questions