diff --git a/src/app.ts b/src/app.ts index cef22c5afc57e765fb3bc91698356ac9aad9767a..8e7bd8826160f5badffa0a783f43bfa81e95fa67 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,6 +1,10 @@ import express, { Request, Response } from 'express' import * as bookController from './controllers/bookController' import { connectMongoDB } from './database' +import { AddressInfo } from 'node:net' + +import logger from './logger' +import { Server } from 'node:http' // Our Express APP config const app = express() @@ -9,6 +13,18 @@ app.set('port', 5000) app.use(express.urlencoded({ extended: false })) // Parses urlencoded bodies app.use(express.json()) // Send JSON responses +// logs all requests on http level => could later be saved into "access.log" for example +app.use((req, res, next) => { + logger.http(req.url) + const start = Date.now() + res.on('finish', () => { + logger.http( + `Finished ${req.url} | ${res.statusCode} [${Date.now() - start}ms]` + ) + }) + next() +}) + app.get('/', (req, res) => { res.send('The sedulous hyena ate the antelope!') }) @@ -20,20 +36,23 @@ app.post('/book', bookController.addBook) app.put('/book/:id', bookController.updateBook) app.delete('/book/:id', bookController.deleteBook) -async function startExpress(): Promise<void> { +async function startExpress(): Promise<Server> { return new Promise((resolve, reject) => { - app.listen(app.get('port'), () => { - console.log( - 'App is running on http://localhost:%d', - app.get('port') - ) - resolve() - }).on('error', reject) + const server = app + .listen(app.get('port'), () => { + console.log( + 'App is running on http://localhost:%d', + app.get('port') + ) + resolve(server) + }) + .on('error', reject) }) } // main startup ;(async () => { - await Promise.all([startExpress(), connectMongoDB()]) - console.log('server running and database connected') + const [server, _] = await Promise.all([startExpress(), connectMongoDB()]) + const addr = server.address() as AddressInfo + logger.info(`Server started on http://localhost:${addr.port}`) })() diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..f52c24a65f6bbf5f2864a3ea0d76a1a9ddd651ef --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,20 @@ +import winston from 'winston' + +const logFormat = winston.format.printf(({ level, message }) => { + return `${new Date().toISOString()}-${level}: ${JSON.stringify( + message, + null, + 4 + )}\n` +}) + +const logger = winston.createLogger({ + transports: [ + new winston.transports.Console({ + level: 'debug', + format: winston.format.combine(winston.format.colorize(), logFormat) + }) + ] +}) + +export default logger