Зарегистрировать запрос с помощью bunyan

Я создаю приложение с помощью node.js и экспресс. Я начал использовать bunyan, но мне трудно понять горячие запросы для регистрации.

Скажем, мой маршрутизатор вызывает такую ​​функцию:

function(request, someOtherStuff, done){\\do something}

где request генерируется из POST-запроса и содержит кое-что в request.body.

Я хотел бы сделать следующее: когда внутри функции возникает ошибка, я хотел бы зарегистрировать ошибку, а также запрос (включая req.body) от пользователя. Что-то типа:

if(err) {
  bunyan.error(err,request);
  done(err);
}

Я знаю, что могу использовать serializers: {req: reqSerializer} в конфигурации bunyan, но я не смог найти ни одного примера, где запрос действительно регистрируется.

Любое предложение высоко ценится.


person k88074    schedule 23.06.2014    source источник


Ответы (2)


Я реализовал так: добавил обработчик в app.js следующим образом:

app.use(function(req, res, next){
    log.info(reqSerializer(req));
    next();
});

Затем функция reqSerializer содержит то, что вы хотели бы вернуть, например.

function reqSerializer(req) {
   return {
        method: req.method,
        url: req.url,
        headers: req.headers,
        somethingCustom: ...,
    }
}

Также убедитесь, что reqSerializer включен при инициализации регистратора, например

var log = bunyan.createLogger({
    name: 'myapp',
    serializers: {
        req: reqSerializer
    },
}

Таким образом, все, что делает сериализатор, это сериализует объект req, вам все равно нужно фактически передать его в регистратор, чтобы он был зарегистрирован.

person onux    schedule 08.07.2015

Что делает сериализатор, так это гарантирует, что если вы передадите поле с именем «req» при записи записи журнала, оно будет правильно отформатировано.

Итак, когда у вас есть этот сериализатор, вы можете зарегистрировать ошибку с запросом, просто вызвав:

logger.error({ req: request, err: err }, "Optionally, some message");

Где logger — результат вызова bunyan.createLogger с некоторыми параметрами.

Вы также можете изучить что-то вроде morgan, специально разработанного для регистрации запросов, или, возможно, bunyan-request, если вы ищете что-то более структурированное.

(И кстати, я надеюсь, что в своем вопросе, когда вы написали {req: reqSerializer}, вы имели в виду {req: bunyan.stdSerializers.req}.)

person Tomty    schedule 08.01.2015