From 3379f7492142d20346446790dd4a491a29da44ce Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Sat, 12 Jul 2025 15:45:09 +0000
Subject: [PATCH] adding better logging

---
 lib/db.js     |   15 ++++---
 settings.js   |    5 +-
 app.js        |   34 ++++++++++-------
 lib/search.js |   20 +++++----
 logger.js     |   25 ++++++++++++
 5 files changed, 67 insertions(+), 32 deletions(-)

diff --git a/app.js b/app.js
index 7e1f278..5342e21 100644
--- a/app.js
+++ b/app.js
@@ -1,10 +1,13 @@
 const path = require("path")
 const fastify = require('fastify')({
-   logger: true
+   logger: false,
+   // logger: true
 })
 const _ = require("lodash")
 const fs = require("node:fs")
+const dayjs = require("dayjs")
 
+const log = require("./logger")
 const db = require("./lib/db")
 const libIlias = require("./lib/libIlias")
 const settings = require("./settings")
@@ -19,17 +22,19 @@
 
 // AUTH
 fastify.addHook("onRequest", async (req, res) => {
-   console.log(req.url)
+   // custom logging
+   log.info(`${req.method} ${req.url}`);
+   // console.log(req.url)
+
    const token = req.query.token
-   console.log(req.url)
    if (token !== settings.authtoken && !req.url.startsWith("/ui/")) {
-      console.error("# AUTH ERROR #", token)
+      log.error("# AUTH ERROR #", token)
       await promiseDelay(500) // delay response to avoid denial of service attacks
       res.code(403)
       return res.send({status: "error", error: "access denied"})
    }
    else {
-      console.log("AUTH FOR ", req.url)
+      log.debug("AUTH FOR ", req.url)
    }
 })
 
@@ -40,19 +45,19 @@
 searchLib.doIndex().catch(console.error)
 fastify
    .get("/api/search/user", async function (req, res) {
-      console.log(req.query)
+      log.info(req.query)
       const search = req.query?.search
       if (!search) {
          return res.code(422).send({status: "error", msg: "no search"})
       }
       else {
-         console.log(search)
+         log.info(search)
          const data = await searchLib.search(search)
          return res.send(data)
       }
    })
    .post("/api/search/reindex", async function (req, res) {
-      console.log("REINDEX ++++")
+      log.info("REINDEX ++++")
       const start = Date.now()
       await searchLib.doIndex().catch(console.error)
       return res.send({
@@ -97,7 +102,7 @@
    })
    .get("/api/user/teilnahmen/:userId", async function (req, res) {
       let userId = req.params.userId
-      console.log(`--------${userId}-----------`, typeof userId)
+      log.debug(`--------${userId}-----------`, typeof userId)
       if (!userId || isNaN(Number(userId))) {
          return res.code(500).send({status: "error", msg: "userId error"})
       }
@@ -127,7 +132,7 @@
       }
       else {
          const res2 = await libIlias.deleteUser(usr_id)
-         console.log(res2)
+         log.info(res2)
          return res.send(res2)
       }
    })
@@ -232,7 +237,6 @@
    .post("/api/kurs/:refId/status/:usrId", async function (req, res) {
       const {refId, usrId} = req.params
       const {passed, status} = req.body
-      // console.log(88888888888888888888, {refId, usrId, passed, status})
       if (!refId || !usrId || _.isNil(passed) || _.isNil(status)) {
          throw {
             statusCode: 400,
@@ -286,7 +290,7 @@
 
 const indexFile = fs.readFileSync(path.join(__dirname, "vue/dist", 'index.html'), 'utf8')
 fastify.setNotFoundHandler(function (req, res) {
-   console.log("!!!")
+   log.error("!!! Not found")
    // res.sendFile("vue/dist/index.html")
    res.type("text/html").send(indexFile)
 })
@@ -295,9 +299,10 @@
 /////////////////////////////////////////////////////////////////////////
 
 fastify.listen({port: settings.port}, function (err, address) {
-   console.log("📡 -=> Listening on", address)
+   log.info("📡 -=> Listening on", address)
    if (err) {
-      fastify.log.error(err)
+      // fastify.log.error(err)
+      log.error(err)
       process.exit(1)
    }
    // Server is now listening on ${address}
@@ -308,3 +313,4 @@
 async function promiseDelay (ms) {
    return new Promise(resolve => setTimeout(resolve, ms))
 }
+
diff --git a/lib/db.js b/lib/db.js
index 3bc907c..af6fa94 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -1,6 +1,7 @@
 const mysql = require("mysql2/promise")
 const dayjs = require("dayjs")
 
+const log = require("../logger")
 const searchLib = require("./search")
 const {host, port, user, database, password} = require("./../settings").db
 
@@ -80,7 +81,7 @@
 }
 
 async function getUsers (offset = 0, limit = 10, search = null) {
-   console.log("++++++++++ get users", offset, limit, search)
+   log.info("++++++++++ get users", offset, limit, search)
    limit = Number(limit) || 10
    offset = Number(offset) || 0
    // TODO check args for SQL Injection
@@ -89,7 +90,7 @@
 
    try {
       let userSearchQuery = await getUserSearchQuery(offset, limit, search)
-      // console.log(userSearchQuery)
+      // log.info(userSearchQuery)
       const [results, fields] = await pool.query(userSearchQuery)
       const count = await getUserCount(offset, limit, search)
       return {
@@ -324,7 +325,7 @@
               WHERE (or2.ref_id = ${ref_id} OR parent_id = ${ref_id})
               ORDER BY usr_id
    `
-   // console.log(q)
+   // log.info(q)
    const [results] = await pool.query(q)
    return results
 }
@@ -355,7 +356,7 @@
                 AND om.usr_id = ${usr_id}
               ORDER BY usr_id
    `
-   // console.log(q)
+   // log.info(q)
    const [results] = await pool.query(q)
    return results[0]
 }
@@ -391,7 +392,7 @@
               WHERE om.usr_id = ${usr_id}
                 AND om.member = 1
    `
-   console.log(q)
+   log.info(q)
    const [results] = await pool.query(q)
    return results
 }
@@ -471,8 +472,8 @@
  *
  * @param courseId
  * @param userId
- * @param passed
- * @param status
+ * @param {Number} passed
+ * @param {Number} status
  * @returns {Promise<{status: string}>}
  */
 async function setStatus (courseId, userId, passed = null, status = null) {
diff --git a/lib/search.js b/lib/search.js
index 11e1536..a6458b0 100644
--- a/lib/search.js
+++ b/lib/search.js
@@ -1,7 +1,9 @@
+const fs = require("node:fs")
 const _ = require("lodash")
 const {Index, Document, Worker} = require("flexsearch")
+
 const settings = require("../settings")
-const fs = require("node:fs")
+const log = require("../logger")
 
 /////////////////////////////////////////////////////////////////////////
 
@@ -67,12 +69,12 @@
 }
 
 // run()
-// .then(console.log)
+// .then(log.info)
 // .catch(console.error)
 
 async function run () {
    await doIndex()
-   console.log(search("latu"))
+   log.info(search("latu"))
 }
 
 /////////////////////////////////////////////////////////////////////////
@@ -80,7 +82,7 @@
 let indexed = false
 async function doIndex () {
    const start = Date.now()
-   console.log("++ START indexing Users...")
+   log.info("++ START indexing Users...")
    const {readFromFile, file} = settings.search
    clearIndex(idxUser)
 
@@ -90,10 +92,10 @@
       users = JSON.parse(users)
    }
    else {
-      console.log("~~~ reading users from DB ... ~~~")
+      log.info("~~~ reading users from DB ... ~~~")
       const db = require("./db")
       const {data} = await db.getUsers(0, 100000)
-      console.log(`loaded ${data.length} users from DB...`)
+      log.info(`loaded ${data.length} users from DB...`)
       users = data
    }
 
@@ -102,7 +104,7 @@
       // addTags(user)
    }
    indexed = true
-   console.log(`++ END indexing Users in ${Date.now() - start}ms`)
+   log.info(`++ END indexing Users in ${Date.now() - start}ms`)
 }
 
 async function search (query) {
@@ -114,7 +116,7 @@
 
 function searchUsers (query, user) {
    // query = query.split(" ").join(" OR ") // ohne das "OR" scheint immer nur "AND" zu sein | die search option {bool:"or"} wird ignoriert
-   // console.log(`searching messages for "${query}"`)
+   // log.info(`searching messages for "${query}"`)
    return idxUser.search(`${user} ${query}`, {suggest: true})
 }
 
@@ -130,7 +132,7 @@
 
 function getUserString (user) {
    const {usr_id, firstname, lastname, login, institution, department} = user
-   // if(firstname.trim()==="Adolfo") console.log(user)
+   // if(firstname.trim()==="Adolfo") log.info(user)
    return `${login} ${firstname} ${lastname} ${institution} ${department}`.trim()
    // return `${usr_id} ${login} ${firstname} ${lastname} ${institution} ${department}`.trim() // KEINE usr_id
    // return `${usr_id} ${firstname} ${lastname}`.trim()
diff --git a/logger.js b/logger.js
new file mode 100644
index 0000000..b9c29cb
--- /dev/null
+++ b/logger.js
@@ -0,0 +1,25 @@
+const _ = require("lodash")
+const dayjs = require("dayjs")
+
+/////////////////////////////////////////////////////////////////////////
+
+module.exports = {
+   debug: msg => log("DEBUG", msg),
+   info: msg => log("INFO", msg),
+   warn: msg => log("WARN", msg),
+   error: msg => log("ERROR", msg),
+}
+
+/////////////////////////////////////////////////////////////////////////
+
+function log (level, msg) {
+   if (!_.isString(msg)) {
+      if (msg.message) {
+         msg = msg.message
+      }
+      else {
+         msg = JSON.stringify(msg)
+      }
+   }
+   console.log(`${level} ${dayjs().format("DD.MM.YYYY HH:mm:ss")} - ${msg}`)
+}
diff --git a/settings.js b/settings.js
index 42ffbbc..e6ed42c 100644
--- a/settings.js
+++ b/settings.js
@@ -1,11 +1,12 @@
 var nconf = require("nconf")
+const log = require("./logger")
 
 var env = process.env["NODE_ENV"]
 if (!env) throw new Error("NODE_ENV required!")
-console.log("Using NODE_ENV='%s'", env)
+log.info("Using NODE_ENV='%s'", env)
 
 var file = "settings." + env + ".json"
-console.log("Reading config file '%s'", file)
+log.info("Reading config file '%s'", file)
 nconf.file("prod", file)
 nconf.file("default", "settings.default.json")
 

--
Gitblit v1.8.0