From a82027a51a3056e574b9c6c8941a7a16f5841126 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Thu, 08 Oct 2026 16:37:12 +0000
Subject: [PATCH] GS-2555

---
 settings.js           |    3 +++
 lib/libIlias.js       |    7 ++++---
 settings.default.json |    3 +++
 .mocharc.js           |    7 +++++++
 logger.js             |   27 +++++++++++++++++++++++++++
 README.md             |   10 ++++++++++
 6 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/.mocharc.js b/.mocharc.js
new file mode 100644
index 0000000..3b3b295
--- /dev/null
+++ b/.mocharc.js
@@ -0,0 +1,7 @@
+// Mocha config: keep manual test runs quiet unless LOG_LEVEL is set explicitly.
+process.env.LOG_LEVEL ||= "error"
+
+module.exports = {
+   exit: true,
+   timeout: 20000,
+}
diff --git a/README.md b/README.md
index 04737e4..acfa705 100644
--- a/README.md
+++ b/README.md
@@ -232,6 +232,16 @@
 
 ### Logs
 
+The log level is configured in `settings.$NODE_ENV.json` via `log.level`
+(default `info`). The `LOG_LEVEL` environment variable overrides it, which is
+handy for quiet test runs:
+
+    LOG_LEVEL=error npm test
+
+Valid levels: `debug`, `info`, `warn`, `error`, and `silent` (or `off`) to
+disable logging entirely. Messages below the active level are neither printed
+nor written to `log.log`.
+
 To prevent logs from growing too big the file `$INSTALLDIR/log.log` should be included into a logrotation job.
 
 Furthermore `pm2` also does some logging.
diff --git a/lib/libIlias.js b/lib/libIlias.js
index 37b4108..1b5630d 100644
--- a/lib/libIlias.js
+++ b/lib/libIlias.js
@@ -5,6 +5,7 @@
 const db = require("./db")
 const {url, iliastoken} = settings.ilias
 const search = require("./search")
+const log = require("../logger")
 
 /////////////////////////////////////////////////////////////////////////
 
@@ -35,7 +36,7 @@
       token: iliastoken,
    })
    let url2 = `${url}?${sp.toString()}`
-   console.log("pinging url", url2)
+   log.debug("pinging url", url2)
    const res = await fetch(url2, {method: "GET"})
    return await res.json() //
 }
@@ -192,7 +193,7 @@
       token: iliastoken,
    })
    let url2 = `${url}?${sp.toString()}`
-   console.log(url2)
+   log.debug(url2)
    const res = await fetch(url2, {method: "POST"})
    return await res.json()
 }
@@ -205,7 +206,7 @@
       token: iliastoken,
    })
    let url2 = `${url}?${sp.toString()}`
-   console.log(url2)
+   log.debug(url2)
    const res = await fetch(url2, {method: "DELETE"})
    return await res.json()
 }
diff --git a/logger.js b/logger.js
index f4dd416..e81f4b5 100644
--- a/logger.js
+++ b/logger.js
@@ -5,16 +5,43 @@
 
 /////////////////////////////////////////////////////////////////////////
 
+const LEVELS = {debug: 10, info: 20, warn: 30, error: 40}
+const DEFAULT_LEVEL = "info"
+
+// level configured from settings (see settings.js); env LOG_LEVEL overrides it
+let settingsLevel = null
+
 module.exports = {
    debug: msg => log("DEBUG", msg),
    info: msg => log("INFO", msg),
    warn: msg => log("WARN", msg),
    error: msg => log("ERROR", msg),
+   setLevel,
+   level: currentLevel,
 }
 
 /////////////////////////////////////////////////////////////////////////
 
+/**
+ * Set the level from settings. The LOG_LEVEL env var still takes precedence.
+ */
+function setLevel (level) {
+   settingsLevel = level ? level.toString().trim().toLowerCase() : null
+}
+
+/**
+ * Resolve the active log level: LOG_LEVEL env var > settings level > "info".
+ */
+function currentLevel () {
+   const level = process.env.LOG_LEVEL || settingsLevel || DEFAULT_LEVEL
+   return level.toString().trim().toLowerCase()
+}
+
 function log (level, msg) {
+   const threshold = currentLevel()
+   if (threshold === "silent" || threshold === "off") return
+   if (LEVELS[level.toLowerCase()] < (LEVELS[threshold] ?? LEVELS[DEFAULT_LEVEL])) return
+
    if (!_.isString(msg)) {
       if (msg.message) {
          msg = msg.message
diff --git a/settings.default.json b/settings.default.json
index badd093..c6fd6de 100644
--- a/settings.default.json
+++ b/settings.default.json
@@ -2,6 +2,9 @@
    "authtoken": "jiuGfr432898D90290kjfsldkfn3hh8F",
    "port": 4101,
    "restUrl": "http://localhost:4101",
+   "log": {
+      "level": "info"
+   },
    "db": {
       "host": "localhost",
       "port": 33009,
diff --git a/settings.js b/settings.js
index b2b0913..0f7ca07 100644
--- a/settings.js
+++ b/settings.js
@@ -12,4 +12,7 @@
 
 var settings = nconf.get()
 
+// configure the logger level (LOG_LEVEL env var still takes precedence)
+log.setLevel(settings.log && settings.log.level)
+
 module.exports = settings

--
Gitblit v1.8.0