Как добавить идентификатор сеанса в каждый журнал в winston logger

В моем приложении узла я использую модуль winston для хранения журналов приложений. Я получаю журнал как:

2017-11-22T07:16:38.632Z - info: asset type is attached successfully

Теперь я хочу добавить идентификатор сеанса после метки времени. Я хочу, чтобы мой журнал был следующим:

 2017-11-22T07:16:38.632Z -**sessionId here**- info: asset type is attached successfully.

Мой код, который я использовал для ведения журнала winston:

var winston = require('winston');
require('winston-daily-rotate-file');
const levels = {
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6,
  trace: 7
};

var transport = new (winston.transports.DailyRotateFile)({
  filename: 'logs/./log',
  datePattern: 'yyyy-MM-dd.',
  prepend: true,
  json: false,
  level: process.env.ENV === 'development' ? 'debug' : 'info'
});

var logger = new (winston.Logger)({
  levels: levels,
  transports: [
    transport
  ]
});

module.exports = logger;

person HOTAM SINGH    schedule 22.11.2017    source источник
comment
скопируйте-вставьте свой код, а не изображение вашего кода   -  person LMokrane    schedule 22.11.2017


Ответы (2)


Вы должны настроить формат журнала https://github.com/winstonjs/winston/tree/2.x#custom-log-format

Сначала обновите свой транспорт:

var transport = new (winston...
  ...
  level: process.env.ENV === 'development' ? 'debug' : 'info',
  timestamp: () => {
    let today = new Date();
    return today.toISOString();
  },
  formatter: options => `${options.timestamp()} -${options.meta.sessionId}- ${options.level}: ${options.message}`
});

Затем просто передайте идентификатор сеанса в свою мета-функцию регистратора:

logger.info('asset type is attached successfully', {sessionId: 'mySessionID'});

и вы получаете

2017-11-22T14:13:17.697Z -mySessionID- информация: тип актива успешно подключен

Редактировать: вместо того, чтобы экспортировать только объект winston.logger, мы экспортируем объект, который требует идентификатора сеанса в качестве параметра и содержит winston.logger. Мы также обновляем транспорт, поэтому настраиваем его свойство formatter в новом объекте Logger. В свойстве formatter мы заменяем объявление meta новой переменной this.sessionId, чтобы не использовать meta свойство больше.

logger.js:

var transport = new (winston...
  ...
  level: process.env.ENV === 'development' ? 'debug' : 'info',
  timestamp: () => {
    let today = new Date();
    return today.toISOString();
  }
});

class Logger {
  constructor(session) {
    this.sessionId = session;
    this.transport = transport;
    this.transport.formatter = options => `${options.timestamp()} -${this.sessionId}- ${options.level}: ${options.message}`;
    this.logger = new (winston.Logger)({
      levels: levels,
      transports: [this.transport]
    });
  }
}

module.exports = Logger;

сервер.js:

const Logger = require('./logger.js');
let logman = new Logger('my_session_id');
let logger = logman.logger;

logger.info('asset type is attached successfully');

2017-11-23T13:13:08.769Z -my_session_id- информация: тип актива успешно подключен

person LMokrane    schedule 22.11.2017
comment
Привет, спасибо user1851595 за ответ, но это не решит мою проблему. около 300-400 строк должны быть зарегистрированы с помощью winston. Итак, мне нужно отправить эти метаданные 300-400 раз в каждом журнале. Есть ли другой способ добиться этого путем незначительных изменений. Заранее спасибо. Скажи мне, если это возможно. - person HOTAM SINGH; 23.11.2017

У меня был тот же запрос, и я не был в восторге от решения... Мне понравилось, как стандартный регистратор форматировал журналы, и я не хотел изобретать это колесо. Кроме того, я надеялся на что-то более компактное, и, кажется, я его нашел. Я не программист javascript, поэтому это может быть не очень хорошей практикой кодирования, но, похоже, это хорошо работает для меня...

сервер.js

//Initiate winston logging please
const logger = require('winston');
const common = require('winston/lib/winston/common');

function myFormat(options) {
  options.formatter = null
  options.label = helpers.getSessionId(logger.req)
  return common.log(options);
}

var consoleLoggingConfig = {
  timestamp: true,
  level: process.env.LOG_LEVEL ? process.env.LOG_LEVEL : "info",
  handleExceptions: true,
  humanReadableUnhandledException: true,
  formatter: myFormat
}

logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, consoleLoggingConfig)
logger.info('Winston logging initiated', consoleLoggingConfig)

//Helper to ensure that logger has access to the request object to obtain the session id
app.use(helpers.attachReqToLogger)
module.exports=logger

helpers.js

// Helper to ensure that the winston logger has the request object on it to obtain the sessionId
helpers.attachReqToLogger = function(req, res, next) {
  logger.req = req
  next();
}
person Jeff Wiedemann    schedule 18.01.2018
comment
извините, вы использовали Express или Hapi? - person advapi; 26.11.2020