diff --git a/nodemon.json b/nodemon.json index 099d21a..fa42808 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,6 +1,7 @@ { "env": { - "NODE_ENV": "development" + "NODE_ENV": "development", + "LOG_LEVEL": "debug" }, "ext": "js,json,css,pug,md" } \ No newline at end of file diff --git a/package.json b/package.json index 6b61824..6d1ca37 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,14 @@ "doipjs": "^1.1.0", "dotenv": "^16.0.3", "express": "^4.17.1", + "express-http-context2": "^1.0.0", "express-validator": "^6.13.0", "got": "^11.8.2", "hash-wasm": "^4.9.0", "jstransformer-markdown-it": "^3.0.0", "keyv": "^4.5.0", "libravatar": "^3.0.0", + "nanoid": "^5.0.1", "openpgp": "^5.5.0", "pug": "^3.0.0", "qrcode": "^1.4.4", diff --git a/src/index.js b/src/index.js index 691e462..f99b1d4 100644 --- a/src/index.js +++ b/src/index.js @@ -28,6 +28,8 @@ if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . */ import express from 'express' +import * as httpContext from 'express-http-context2' +import { nanoid } from 'nanoid' import { readFileSync } from 'fs' import { stringReplace } from 'string-replace-middleware' import * as pug from 'pug' @@ -53,8 +55,16 @@ app.set('keyoxide_version', packageData.version) app.set('onion_url', process.env.ONION_URL) // Middlewares +app.use(httpContext.middleware) app.use((req, res, next) => { res.setHeader('Permissions-Policy', 'interest-cohort=()') + httpContext.set('requestId', nanoid()) + httpContext.set('requestPath', req.path) + httpContext.set('requestIp', req.ip) + + logger.info(`Handle a request`, + { component: 'http_server', action: 'request' }) + next() }) diff --git a/src/log.js b/src/log.js index 3a4b0b5..afff79e 100644 --- a/src/log.js +++ b/src/log.js @@ -28,6 +28,7 @@ if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . */ import { createLogger, format, transports } from 'winston' +import * as httpContext from 'express-http-context2' import * as dotenv from 'dotenv' dotenv.config() @@ -37,13 +38,23 @@ const anonymize = format((info, opts) => { info.keyserver_domain = undefined info.username = undefined info.fingerprint = undefined + info.request_path = undefined + info.request_ip = undefined } return info }) +const addRequestData = format((info, opts) => { + if (httpContext.get('requestId')) info.request_id = httpContext.get('requestId') + if (httpContext.get('requestPath')) info.request_path = httpContext.get('requestPath') + if (httpContext.get('requestIp')) info.request_ip = httpContext.get('requestIp') + return info +}) + const logger = createLogger({ level: process.env.LOG_LEVEL || 'info', format: format.combine( + addRequestData(), anonymize(), format.timestamp(), format.json() diff --git a/yarn.lock b/yarn.lock index 546903d..cc01d7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2264,6 +2264,11 @@ events@^3.2.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +express-http-context2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/express-http-context2/-/express-http-context2-1.0.0.tgz#58cd9fb0d233739e0dcd7aabb766d1dc74522d77" + integrity sha512-xdukoNNpWcuMn5ZJcjDe/tA+2A96rQ1MyAB/oWUU7qP15Tkz3txQyFsw/QG8YgRzTJ1sNAA8Bdq0o5b/1Y4zLA== + express-validator@^6.10.0, express-validator@^6.13.0: version "6.15.0" resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-6.15.0.tgz#5e4601428960b0d66f5f4ae09cb32ed2077374a4" @@ -3539,6 +3544,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.1.tgz#3e95d775a8bc8a98afbf0a237e2bbc6a71b0662e" + integrity sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"