# Introduction
[![NPM Version][npm-badge]][npm-url]
[![NPM Downloads][npmd-badge]][npm-url]
[![Build Status][travis-badge]][travis-url]
[![Test Coverage][codecov-badge]][codecov-url]
[![Dependencies][dependencies-badge]][dependencies-url]
[![devDependencies][devDependencies-badge]][devDependencies-url]
[![Known Vulnerabilities][snyk-badge]][snyk-url]

A simple logging middleware for the [express] http framework for nodejs. This module uses the [pino] logger and was inspired by the [koa-req-logger] module. This module was created with typescript, and is compatible with both javascript and typescript projects.

As well as logging requests and providing a log object in requests, this module also sets the HTTP Headers and X-Request-ID.
- **X-Request-ID** Header is set to a new uuid or the value of the X-Request-ID header sent with the request. This allows requests to be tracked through microservices.
- **Date** Header is set to the date and time that the request was received.

## Contents
- [Install](#Install)
- [Usage](#Usage)
- [Test](#Test)
- [License](#License)

# Install
```
yarn add express-req-logger
npm install express-req-logger
```

# Usage

### TypeScript
```ts
import express = require('express');
import {NextFunction, Request, Response} from 'express-serve-static-core';
import {ExpressReqLogger, resBodySerializer} from './';

const app: express.Application = express();
const logger = new ExpressReqLogger({
    pinoOptions: {
        enabled: true,
        serializers: {
            res: resBodySerializer,
        }
    }
});
app.use(logger.getMiddleware());

app.get('/', async (req: Request, res: Response, next: NextFunction) => {
    res.status(200);
    res.json({
        data: 'Hello World!'
    });
});

app.use(logger.getErrorHandlingMiddleware());

app.listen(3000);
```


### Output
Produces a similar output to the following json, which can then be parsed with pino's shell utility to pretty-print the output.

```json
{"level":30,"time":1532251116578,"msg":"::1 - GET /","pid":4992,"hostname":"server.local","id":"ff0bae4b-b067-4cd6-8b99-5d221e74c515","req":{"method":"GET","url":"/","headers":{"host":"localhost:3000","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","accept-encoding":"gzip, deflate, br","accept-language":"en-GB,en-US;q=0.9,en;q=0.8"}},"startDate":"Sun, 22 Jul 2018 09:18:36 GMT","v":1}
{"level":30,"time":1532251116579,"msg":"Some Log Message","pid":4992,"hostname":"server.local","id":"ff0bae4b-b067-4cd6-8b99-5d221e74c515","v":1}
{"level":40,"time":1532251116579,"msg":"Log a message with an object","pid":4992,"hostname":"server.local","id":"ff0bae4b-b067-4cd6-8b99-5d221e74c515","obj":"object","v":1}
{"level":50,"time":1532251116583,"msg":"::1 - GET / - 400 4ms","pid":4992,"hostname":"server.local","id":"ff0bae4b-b067-4cd6-8b99-5d221e74c515","res":{"status":400,"headers":{"x-request-id":"ff0bae4b-b067-4cd6-8b99-5d221e74c515","date":"Sun, 22 Jul 2018 09:18:36 GMT","x-response-time":"4ms","content-type":"application/json; charset=utf-8"}},"err":{"type":"ClientError","message":"Bad Request","stack":"BadRequestError: Bad Request\n    at Object.throw (/home/drbarnabus/Development/test-service/node_modules/koa/lib/context.js:96:11)...","status":400,"statusCode":400,"expose":true},"responseTime":4,"startDate":"Sun, 22 Jul 2018 09:18:36 GMT","v":1}
```

# Test
```
yarn test
npm test
```

# License
Licensed under [MIT](./LICENSE).

<!-- Links --->
[express]: https://github.com/expressjs/express
[pino]: https://github.com/pinojs/pino
[koa-req-logger]: https://github.com/DrBarnabus/koa-req-logger

<!-- Badges --->
[npm-badge]: https://img.shields.io/npm/v/express-req-logger.svg?style=flat-square
[npm-url]: https://www.npmjs.com/package/express-req-logger
[npmd-badge]: https://img.shields.io/npm/dw/express-req-logger.svg?style=flat-square
[travis-badge]: https://img.shields.io/travis/DrBarnabus/express-req-logger/master.svg?style=flat-square
[travis-url]: https://travis-ci.org/DrBarnabus/express-req-logger
[dependencies-badge]: https://david-dm.org/drbarnabus/express-req-logger.svg?style=flat-square
[codecov-badge]: https://img.shields.io/codecov/c/github/DrBarnabus/express-req-logger/master.svg?style=flat-square
[codecov-url]: https://codecov.io/gh/DrBarnabus/express-req-logger
[dependencies-url]: https://david-dm.org/drbarnabus/express-req-logger
[devDependencies-badge]: https://david-dm.org/drbarnabus/express-req-logger/dev-status.svg?style=flat-square
[devDependencies-url]: https://david-dm.org/drbarnabus/express-req-logger?type=dev
[snyk-badge]: https://snyk.io/test/github/DrBarnabus/express-req-logger/badge.svg?targetFile=package.json&style=flat-square
[snyk-url]: https://snyk.io/test/github/DrBarnabus/express-req-logger?targetFile=package.json
