Формат журнала исходящих http-запросов сервера Node.js - PullRequest
0 голосов
/ 30 мая 2018

У меня есть сервер nodejs, и мне нужно реализовать ведение журнала исходящих запросов.

Допустим, я использую запрос узла

const np = require('request-promise');
const logger = require('./winston-logger');

np.get('https://swapi.co/api/planets').
  .then(res => {
    logger.info( ??? )
  })
  .catch(err => {
    logger.error(err);
  })

Мой вопрос, что я должен поместить в logger.info?Запрашиваемый URL, заголовки, тело ответа?Есть ли популярный и установленный большинством разработчиков формат?

Я изучал это и не нашел достаточного решения.Существует формат журнала Apache.Но так ли это лучше для приложений nodejs?Например, нет времени ответа на запрос, что может быть полезно для регистрации.И как это хорошо работает с Winston Logger?Кроме того, я думаю, что этот формат должен быть хорошо узнаваем для парсеров журналов

Есть мысли, как вы подходите к ведению журналов для nodejs?

1 Ответ

0 голосов
/ 30 мая 2018

Я пытался дать вам ответ с каким-то фиктивным фрагментом кода.Я специально использовал Winston для целей регистрации приложений.

В Winston вы также можете задавать пользовательские параметры журнала, а также формат json или текстовый формат.Определенно, в примере кода я не использовал модуль запроса или запроса-обещания, но достаточно хорошо, чтобы понять, как настроить и использовать Winston в приложении.

package.json

{
  "name": "winston",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "express": "4.16.2",
    "http": "0.0.0",
    "nodemon": "1.15.1",
    "winston": "2.4.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

logger.js

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
    new winston.transports.File({
      filename: __dirname + '/logger.log',
      json: false,
      timestamp: function () {
        return new Date()
      },
      handleExceptions: true,
      humanReadableUnhandledException: true,
    })
  ],
  exceptionHandlers: [
    new winston.transports.File({ filename: __dirname + '/exceptions.log', json: false })
  ],
  exitOnError: false
});
module.exports = logger;
module.exports.stream = {
  write: function (message, encoding) {
    logger.info(message);
  }
};

index.js

const express = require('express');
const app = express();
const logger = require("./logger");

app.listen(3000, () => {
  logger.log("info", 'Example app listening on port 3000!');
  const data = require("./data")(app);
});

data.js

const logger = require ("./ logger");logger.log («информация», «выполняет data.js»);

module.exports = ((app) => {

    app.get('/', (req, res) => {
        logger.log("info", "Default route executes");
        res.send("hello world from data file");
    });

    app.get('/hello', (req, res) => {
        logger.log("info", "hello route executes");
        res.send("hello route executes");
    });

    app.use(function (err, req, res, next) {
        logger.log("info", "error routing called");
        logger.log("error", err);
        if (err.name === 'UnauthorizedError') {
            res.status(401).json({ status: 0, code: 401, type: "unauthorised", message: err.name + ": " + err.message });
        } else {
            res.status(404).json({ status: 0, code: 404, type: "ENOENT", message: "file not found" });
        }
    });
    return app;
});
...