diff --git a/src/Application.ts b/src/Application.ts index d9bdec9..03697e4 100644 --- a/src/Application.ts +++ b/src/Application.ts @@ -8,6 +8,7 @@ import Controller from "./Controller"; import MysqlConnectionManager from "./db/MysqlConnectionManager"; import Migration from "./db/Migration"; import {Type} from "./Utils"; +import LogRequestsComponent from "./components/LogRequestsComponent"; import TemplateError = lib.TemplateError; export default abstract class Application { @@ -68,15 +69,7 @@ export default abstract class Application { return next(err); } - let errorID: string; - - let logStr = `${req.method} ${req.originalUrl} Accept: ${req.accepts()} - `; - if (err instanceof BadRequestError || err instanceof ServiceUnavailableHttpError) { - logStr += `${err.errorCode} ${err.name}`; - errorID = Logger.silentError(err, logStr); - } else { - errorID = Logger.error(err, logStr + `500 Internal Error`, err); - } + let errorID: string = LogRequestsComponent.logRequest(req, res, err, '500 Internal Error', err instanceof BadRequestError || err instanceof ServiceUnavailableHttpError); let httpError: HttpError; @@ -131,6 +124,9 @@ export default abstract class Application { case '--verbose': Logger.verbose(); break; + case '--full-http-requests': + LogRequestsComponent.logFullHttpRequests(); + break; case 'migration': await MysqlConnectionManager.migrationCommand(args.slice(i + 1)); return true; diff --git a/src/Logger.ts b/src/Logger.ts index 8d7db60..9e70f79 100644 --- a/src/Logger.ts +++ b/src/Logger.ts @@ -9,6 +9,7 @@ export default class Logger { public static verbose() { this.logLevel = LogLevel[LogLevel[this.logLevel] + 1] || this.logLevel; this.dbLogLevel = LogLevel[LogLevel[this.dbLogLevel] + 1] || this.dbLogLevel; + Logger.info('Verbose mode'); } public static silentError(error: Error, ...message: any[]): string { diff --git a/src/components/LogRequestsComponent.ts b/src/components/LogRequestsComponent.ts index c275b00..3efe6e9 100644 --- a/src/components/LogRequestsComponent.ts +++ b/src/components/LogRequestsComponent.ts @@ -1,14 +1,60 @@ import ApplicationComponent from "../ApplicationComponent"; import onFinished from "on-finished"; import Logger from "../Logger"; -import {Express, Router} from "express"; +import {Express, Request, Response, Router} from "express"; export default class LogRequestsComponent extends ApplicationComponent { + private static fullRequests: boolean = false; + + public static logFullHttpRequests() { + this.fullRequests = true; + Logger.info('Http requests will be logged with more details.'); + } + + public static logRequest(req: Request, res: Response, err: any = null, additionalStr: string = '', silent: boolean = false): string { + if (!LogRequestsComponent.fullRequests) { + let logStr = `${req.method} ${req.originalUrl} - ${res.statusCode}`; + if (err) { + if (silent) { + logStr += `${err.errorCode} ${err.name}`; + return Logger.silentError(err, logStr); + } else { + return Logger.error(err, logStr, additionalStr, err); + } + } else { + Logger.info(logStr); + } + } else { + const requestObj = { + ip: req.ip, + host: req.hostname, + method: req.method, + url: req.originalUrl, + headers: req.headers, + query: req.query, + params: req.params, + body: req.body, + cookies: req.cookies, + sessionId: req.sessionID, + result: { + code: res.statusCode + } + }; + if (err) { + return Logger.error(err, requestObj, err); + } else { + Logger.info(requestObj); + } + } + + return ''; + } + public async start(app: Express, router: Router): Promise { router.use((req, res, next) => { onFinished(res, (err) => { if (!err) { - Logger.info(`${req.method} ${req.originalUrl} Accept: ${req.accepts()} - ${res.statusCode}`); + LogRequestsComponent.logRequest(req, res); } }); next();