Rest.log is a Express.js middleware what expose the request-response pair in a format of events for porpouse to log or detect what happens in API, according with it API contract.
- node >= 6.x.x
- express >= 4
$ npm install restlog --save
const app = require("express")()
const restlog = require("restlog")
app.use(restlog({
// Array of reject patterns in url
rejectPatterns: [ /.ico/ ],
// extracts from request or response and add to Event
extracts: {
isBot: (req, res) => isBot(req.headers['user-agent'])
},
// Array with each output of log desired
logIn: [
// log in stdOut
event => console.log(event),
]
}))
JsonSchema
{
"url": "string",
"resource": "string",
"path": "string",
"method": "string",
"query": "object",
"hostname": "string",
"protocol": "string",
"userAgent": "string",
"isoDate": "string",
"milliseconds": "number",
"date": {
"day": "number",
"month": "number",
"year": "number",
"hour": "number",
"minute": "number",
"second": "number"
},
"request": {
"params": "object",
"query": "object",
"method": "string",
"headers": "object",
"path": "string",
"body": "object" | "string" | undefined
},
"response": {
"query": "object",
"headers": "object",
"body": "object" | "string" | undefined,
}
}
Example:
{
"url": "http://localhost:3000/api/v1/test/234",
"resource": "GET /api/v1/test/:id",
"path": "/api/v1/test/234",
"method": "GET",
"query": {},
"hostname": "localhost",
"protocol": "http",
"userAgent": "axios/0.18.0",
"isoDate": "2018-07-26T17:29:39.384Z",
"milliseconds": 162,
"date": {
"day": 26,
"month": 7,
"year": 2018,
"hour": 14,
"minute": 29,
"second": 39
},
"request": {
"params": { "id": "234" },
"query": {},
"method": "GET",
"headers":
{
"accept": "application/json, text/plain",
"user-agent": "axios/0.18.0",
"host": "localhost:3000",
"connection": "close"
},
"path": "/api/v1/test/234",
"body": "undefined"
},
"response": {
"readers": {
"x-powered-by":
"Express"
},
"status": 200,
"body": null
}
}
app.use(restlog({
// Array with each output of log desired
logIn: [
event => {
const { resource, response, request } = event
if(resource === "POST /api/v1/user/" && response.status === 201) {
const { name, id, email } = response
notifyUserCreationToOtherApi(id, { name, email })
} else if (resource === "PUT /api/v1/user/:id" && response.status === 200)) {
const { body: attrs, params } = request
notifyUserUpdateToOtherApi(params.id, attrs)
}
}
]
}))
const restlog = require("restlog")
const app = require("express")()
const isBot = require("isbot")
const flat = require("flat")
const AWS = require("aws-sdk")
const firehose = new AWS.Firehose({ apiVersion: "2015-08-04", region: "us-east-1" })
app.use(restlog({
// Array of reject patterns in url
rejectPatterns: [ /.ico/ ],
// extracts from request or response and add To eventLog
extracts: {
isBot: (req, res) => isBot(req.headers['user-agent'])
},
// Array with each output of log desired
logIn: [
// put in firehose
event => {
firehose.putRecord({
DeliveryStreamName: 'test',
Record: {
Data: [ JSON."string"ify(flat(event)), "\n" ].join("")
}
}).promise()
.then(res => console.log(res))
.catch(console.error)
},
// log in stdOut
event => console.log(event),
event => /* ... saves on mongoDB etc*/
]
}))
app.get("/api/v1/test/:id", (req, res) => {
setTimeout(() =>
res.send({ msg: "ok" })
, Math.random() * 1000)
})
app.put("/api/v1/test/:id", (req, res) => {
setTimeout(() =>
res.send({ msg: "ok" })
, Math.random() * 3000)
})
app.delete("/api/v1/test/:id", (req, res) => {
setTimeout(() =>
res.send({ msg: "ok" })
, Math.random() * 3000)
})
setInterval(() =>
axios.get("http://localhost:3000/api/v1/test/234")
, 200)
setInterval(() =>
axios.put("http://localhost:3000/api/v1/test/123")
, 500)
setInterval(() =>
axios.delete("http://localhost:3000/api/v1/test/123")
, 8000)
app.listen(3000, "localhost", () => {
console.log("start !in port 3000")
})
Afetr query in Aws Athena...
- Rest.log was writen in 6.x.x node version and uses features available from this release.
- Rest.log was writen to work with expressjs.
- Refac code in modules
- Test coverage in 70%
- all http methods
content empty- all express response methods
res.json()res.sendFile()res.download()res.render()res.sendStatus()res.redirect()
express errors 404