diff --git a/README.md b/README.md index fcc7008..64f88c7 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,9 @@ Options: // включить/выключить ежеминутный вывод в лог memUsage и loadAvg "logServerStats": false, + // включить/выключить вывод в лог запросов и времени их выполнения + "logQueries": false, + // максимальный размер кеша каждой таблицы в БД, в блоках (требуется примерно 1-10Мб памяти на один блок) // если надо кешировать всю БД, можно поставить значение от 1000 и больше "dbCacheSize": 5, diff --git a/server/config/base.js b/server/config/base.js index dba37db..0b36a97 100644 --- a/server/config/base.js +++ b/server/config/base.js @@ -19,6 +19,7 @@ module.exports = { bookReadLink: '', loggingEnabled: true, logServerStats: false, + logQueries: false, //поправить в случае, если были критические изменения в DbCreator или InpxParser //иначе будет рассинхронизация по кешу между сервером и клиентом на уровне БД diff --git a/server/config/index.js b/server/config/index.js index 8057eb5..7c8d0e7 100644 --- a/server/config/index.js +++ b/server/config/index.js @@ -13,6 +13,7 @@ const propsToSave = [ 'bookReadLink', 'loggingEnabled', 'logServerStats', + 'logQueries', 'dbCacheSize', 'maxFilesDirSize', 'queryCacheEnabled', diff --git a/server/controllers/WebSocketController.js b/server/controllers/WebSocketController.js index 8c718c2..4cb38c9 100644 --- a/server/controllers/WebSocketController.js +++ b/server/controllers/WebSocketController.js @@ -56,11 +56,12 @@ class WebSocketController { async onMessage(ws, message) { let req = {}; try { - if (this.isDevelopment) { - log(`WebSocket-IN: ${message.substr(0, 4000)}`); + if (this.isDevelopment || this.config.logQueries) { + log(`WebSocket-IN: ${utils.cutString(message)}`); } req = JSON.parse(message); + req.__startTime = Date.now(); ws.lastActivity = Date.now(); @@ -123,8 +124,9 @@ class WebSocketController { const message = JSON.stringify(r); ws.send(message); - if (this.isDevelopment) { - log(`WebSocket-OUT: ${message.substr(0, 200)}`); + if (this.isDevelopment || this.config.logQueries) { + log(`WebSocket-OUT: ${utils.cutString(message)}`); + log(`${Date.now() - req.__startTime}ms`); } } diff --git a/server/core/utils.js b/server/core/utils.js index 1dd4b9f..0ae75a8 100644 --- a/server/core/utils.js +++ b/server/core/utils.js @@ -196,6 +196,20 @@ function wordEnding(num, type = 0) { } } +function cutString(data, len = 500) { + try { + if (!data) + return ''; + + if (typeof(data) !== 'string') + data = JSON.stringify(data); + + return `${data.substring(0, len)}${data.length > len ? ' ...' : ''}`; + } catch (e) { + return ''; + } +} + module.exports = { sleep, processLoop, @@ -216,4 +230,5 @@ module.exports = { makeValidFileName, makeValidFileNameOrEmpty, wordEnding, + cutString, }; \ No newline at end of file diff --git a/server/index.js b/server/index.js index e37ee8b..a083fbe 100644 --- a/server/index.js +++ b/server/index.js @@ -137,6 +137,18 @@ async function init() { } } +function logQueries(app) { + app.use(function(req, res, next) { + const start = Date.now(); + log(`${req.method} ${req.originalUrl} ${utils.cutString(req.body)}`); + //log(`${JSON.stringify(req.headers, null, 2)}`) + res.once('finish', () => { + log(`${Date.now() - start}ms`); + }); + next(); + }); +} + async function main() { const log = new (require('./core/AppLogger'))().log;//singleton @@ -168,6 +180,10 @@ async function main() { const { WebSocketController } = require('./controllers'); new WebSocketController(wss, webAccess, config); + if (config.logQueries) { + logQueries(app); + } + if (devModule) { devModule.logErrors(app); } else {