Răsfoiți Sursa

В конфиг добавлен параметр logQueries для журналирования запросов и времени их выполнения

Book Pauk 1 an în urmă
părinte
comite
bbf7b43aa3

+ 3 - 0
README.md

@@ -114,6 +114,9 @@ Options:
     // включить/выключить ежеминутный вывод в лог memUsage и loadAvg
     "logServerStats": false,
 
+    // включить/выключить вывод в лог запросов и времени их выполнения
+    "logQueries": false,
+
     // максимальный размер кеша каждой таблицы в БД, в блоках (требуется примерно 1-10Мб памяти на один блок)
     // если надо кешировать всю БД, можно поставить значение от 1000 и больше
     "dbCacheSize": 5,

+ 1 - 0
server/config/base.js

@@ -19,6 +19,7 @@ module.exports = {
     bookReadLink: '',
     loggingEnabled: true,
     logServerStats: false,
+    logQueries: false,
 
     //поправить в случае, если были критические изменения в DbCreator или InpxParser
     //иначе будет рассинхронизация по кешу между сервером и клиентом на уровне БД

+ 1 - 0
server/config/index.js

@@ -13,6 +13,7 @@ const propsToSave = [
     'bookReadLink',
     'loggingEnabled',
     'logServerStats',
+    'logQueries',
     'dbCacheSize',
     'maxFilesDirSize',
     'queryCacheEnabled',

+ 6 - 4
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`);
             }
 
         }

+ 15 - 0
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,
 };

+ 16 - 0
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 {