From e04c82ff3299d8e63ea768ee86f9b35f4089598e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:15:24 +0000 Subject: [PATCH 1/2] Bump body-parser from 1.20.3 to 1.20.6 in /supplement/nodejs Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.20.3 to 1.20.6. - [Release notes](https://github.com/expressjs/body-parser/releases) - [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/body-parser/compare/1.20.3...1.20.6) --- updated-dependencies: - dependency-name: body-parser dependency-version: 1.20.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- supplement/nodejs/package-lock.json | 218 ++++++++++++++++++++-------- 1 file changed, 156 insertions(+), 62 deletions(-) diff --git a/supplement/nodejs/package-lock.json b/supplement/nodejs/package-lock.json index 75acbd0b81..7de8631372 100644 --- a/supplement/nodejs/package-lock.json +++ b/supplement/nodejs/package-lock.json @@ -171,28 +171,55 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -932,11 +959,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dependencies": { - "side-channel": "^1.0.6" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -954,15 +982,42 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "engines": { "node": ">= 0.8" } @@ -1069,13 +1124,13 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -1087,12 +1142,12 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -1477,22 +1532,41 @@ "dev": true }, "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "requires": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } } }, "brace-expansion": { @@ -2044,11 +2118,12 @@ } }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "requires": { - "side-channel": "^1.0.6" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" } }, "range-parser": { @@ -2057,14 +2132,33 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "dependencies": { + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } } }, "resolve": { @@ -2142,24 +2236,24 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "requires": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "requires": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" } }, "side-channel-map": { From 201f92c5c2b46fa2ec844c735adc67d67f13b826 Mon Sep 17 00:00:00 2001 From: Volker Christian Date: Mon, 31 Aug 2026 23:24:30 +0200 Subject: [PATCH 2/2] refactor(logging): remove legacy logging macros --- README.md | 166 ++++++++++-------- src/CMakeLists.txt | 6 + .../0001-add-express-compat-server.patch | 10 +- src/log/Logger.cpp | 19 -- src/log/Logger.h | 49 ------ tests/unit/log/CMakeLists.txt | 4 - tests/unit/log/SemanticEndToEndOutputTest.cpp | 28 +-- tests/unit/log/SemanticLoggerBackendTest.cpp | 6 +- .../log/SemanticLoggerCompatibilityTest.cpp | 117 ------------ .../unit/log/SemanticLoggerFilteringTest.cpp | 6 - 10 files changed, 119 insertions(+), 292 deletions(-) delete mode 100644 tests/unit/log/SemanticLoggerCompatibilityTest.cpp diff --git a/README.md b/README.md index 806d2e1147..dd0b1b34ce 100644 --- a/README.md +++ b/README.md @@ -299,7 +299,7 @@ Sending data to the client is done using the method `sendToPeer()`, which is als #include #include #include -#include +#include // #include #include @@ -310,15 +310,15 @@ public: private: void onConnected() override { // Called in case a connection has been established successfully. - VLOG(1) << "Echo connected to " << getSocketConnection()->getRemoteAddress().toString(); + snode::semantic::appLog().info() << "Echo connected to " << getSocketConnection()->getRemoteAddress().toString(); } void onDisconnected() override { // Called in case the connection has been closed. - VLOG(1) << "Echo disconnected from " << getSocketConnection()->getRemoteAddress().toString(); + snode::semantic::appLog().info() << "Echo disconnected from " << getSocketConnection()->getRemoteAddress().toString(); } bool onSignal(int signum) override { // Called in case a signal has been received - VLOG(1) << "Echo disconnected due to signal=" << signum; + snode::semantic::appLog().info() << "Echo disconnected due to signal=" << signum; return true; // Close the connection } @@ -333,7 +333,7 @@ private: // onReceivedFromPeer will be called again. // No error can occure here. if (chunkLen > 0) { - VLOG(1) << "Data to reflect: " << std::string(chunk, chunkLen); + snode::semantic::appLog().debug() << "Data to reflect: " << std::string(chunk, chunkLen); sendToPeer(chunk, chunkLen); // Reflect the received data back to the client. // Out of memory is the only error which can occure here. } @@ -353,7 +353,7 @@ And like in the `EchoServerContext`, `readFromPeer()` and `sendToPeer()` is used #include #include #include -#include +#include // #include #include @@ -364,18 +364,18 @@ public: private: void onConnected() override { // Called in case a connection has been established successfully. - VLOG(1) << "Echo connected to " << getSocketConnection()->getRemoteAddress().toString(); + snode::semantic::appLog().info() << "Echo connected to " << getSocketConnection()->getRemoteAddress().toString(); - VLOG(1) << "Initiating data exchange"; + snode::semantic::appLog().debug() << "Initiating data exchange"; sendToPeer("Hello peer! It's nice talking to you\n"); // Initiate the ping-pong data exchange. } void onDisconnected() override { // Called in case the connection has been closed. - VLOG(1) << "Echo disconnected from " << getSocketConnection()->getRemoteAddress().toString(); + snode::semantic::appLog().info() << "Echo disconnected from " << getSocketConnection()->getRemoteAddress().toString(); } bool onSignal(int signum) override { // Called in case a signal has been received - VLOG(1) << "Echo disconnected due to signal=" << signum; + snode::semantic::appLog().info() << "Echo disconnected due to signal=" << signum; return true; // Close the connection } @@ -390,7 +390,7 @@ private: // onReceivedFromPeer will be called again. // No error can occure here. if (chunkLen > 0) { - VLOG(1) << "Data to reflect: " << std::string(chunk, chunkLen); + snode::semantic::appLog().debug() << "Data to reflect: " << std::string(chunk, chunkLen); sendToPeer(chunk, chunkLen); // Reflect the received data back to the server. // Out of memory is the only error which can occure here. } @@ -429,6 +429,7 @@ Here we use IPv4 and the `listen()` method which expects a port number, here `80 ```cpp #include "EchoServerContextFactory.h" +#include #include #include // @@ -451,16 +452,16 @@ int main(int argc, char* argv[]) { echoServer.listen(8001, 5, [](const SocketAddress& socketAddress, const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoServer: connected to '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoServer: connected to '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoServer: disabled"; + snode::semantic::appLog().info() << "EchoServer: disabled"; break; case core::socket::State::ERROR: - VLOG(1) << "EchoServer: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoServer: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - VLOG(1) << "EchoServer: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoServer: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -482,6 +483,7 @@ Here it is assumed that we talk to an IPv4 server which runs on the same machine ```cpp #include "EchoClientContextFactory.h" +#include #include #include // @@ -504,16 +506,16 @@ int main(int argc, char* argv[]) { echoClient.connect("localhost", 8001, [](const SocketAddress& socketAddress, const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoClient: connected to '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoClient: connected to '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoClient: disabled"; + snode::semantic::appLog().info() << "EchoClient: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoClient: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoClient: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoClient: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoClient: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -1146,18 +1148,20 @@ As the name suggests this callback is executed after a connection to the peer ha For a concrete `SocketServer` instance (here an anonymous instance) the constructors expecting callbacks can be used like ```cpp +#include + using EchoServer = net::in::stream::legacy::SocketServer; using SocketAddress = EchoServer::SocketAddress; using SocketConnection = EchoServer::SocketConnection; EchoServer echoServer([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer estableshed"; + snode::semantic::appLog().debug() << "Connection to peer estableshed"; }, [] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer ready to be used"; + snode::semantic::appLog().debug() << "Connection to peer ready to be used"; }, [] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer closed"; + snode::semantic::appLog().debug() << "Connection to peer closed"; }); echoServer.listen(...); @@ -1166,18 +1170,20 @@ echoServer.listen(...); and for a concrete `SocketClient` class like ```cpp +#include + using EchoClient = net::in::stream::legacy::SocketServer; using SocketAddress = EchoClient::SocketAddress; using SocketConnection = EchoClient::SocketConnection; EchoClient echoClient([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer estableshed"; + snode::semantic::appLog().debug() << "Connection to peer estableshed"; }, [] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer ready to be used"; + snode::semantic::appLog().debug() << "Connection to peer ready to be used"; }, [] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer closed"; + snode::semantic::appLog().debug() << "Connection to peer closed"; }); echoClient.connect(...); @@ -1194,6 +1200,8 @@ In case `SocketServer` and `SocketClient` instances have been created using a co like for example ```cpp +#include + using EchoServer = net::in::stream::legacy::SocketServer; using SocketAddress = EchoServer::SocketAddress; using SocketConnection = EchoServer::SocketConnection; @@ -1201,15 +1209,15 @@ using SocketConnection = EchoServer::SocketConnection; EchoServer echoServer; echoServer.setOnConnect([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer established"; + snode::semantic::appLog().debug() << "Connection to peer established"; }); echoServer.setOnConnected([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer ready to be used"; + snode::semantic::appLog().debug() << "Connection to peer ready to be used"; }); echoServer.setOnDisconnected([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer closed"; + snode::semantic::appLog().debug() << "Connection to peer closed"; }); echoServer.listen(...); @@ -1218,6 +1226,8 @@ echoServer.listen(...); and ```cpp +#include + using EchoClient = net::in::stream::legacy::SocketServer; using SocketAddress = EchoClient::SocketAddress; using SocketConnection = EchoClient::SocketConnection; @@ -1225,15 +1235,15 @@ using SocketConnection = EchoClient::SocketConnection; EchoClient echoClient; echoClient.setOnConnect([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer established"; + snode::semantic::appLog().debug() << "Connection to peer established"; }); echoClient.setOnConnected([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer ready to be used"; + snode::semantic::appLog().debug() << "Connection to peer ready to be used"; }); echoClient.setOnDisconnected([] (SocketConnection* socketConnection) -> void { - VLOG(1) << "Connection to peer closed"; + snode::semantic::appLog().debug() << "Connection to peer closed"; }); echoClient.connect(...); @@ -2426,7 +2436,9 @@ For instance, if the echo server shall also communicate via e.g. Unix-Domain soc In that case the Main-Application would look like ```cpp - int main(int argc, char* argv[]) { +#include + +int main(int argc, char* argv[]) { core::SNodeC::init(argc, argv); using EchoServerIn = net::in::stream::legacy::SocketServer; @@ -2438,16 +2450,16 @@ In that case the Main-Application would look like const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoServerIn: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoServerIn: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoServerIn: disabled"; + snode::semantic::appLog().info() << "EchoServerIn: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoServerIn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoServerIn: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoServerIn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoServerIn: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -2461,16 +2473,16 @@ In that case the Main-Application would look like const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoServerUn: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoServerUn: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoServerUn: disabled"; + snode::semantic::appLog().info() << "EchoServerUn: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoServerUn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoServerUn: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoServerUn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoServerUn: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -2489,16 +2501,16 @@ In that case the Main-Application would look like const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoServerRc: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoServerRc: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoServerRc: disabled"; + snode::semantic::appLog().info() << "EchoServerRc: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoServerRc: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoServerRc: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoServerRc: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoServerRc: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -2510,6 +2522,8 @@ In that case the Main-Application would look like and the client application with an additional Unix-Domain socket instance look like ```cpp +#include + int main(int argc, char* argv[]) { core::SNodeC::init(argc, argv); @@ -2524,16 +2538,16 @@ int main(int argc, char* argv[]) { const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoClientIn: connected to '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoClientIn: connected to '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoClientIn: disabled"; + snode::semantic::appLog().info() << "EchoClientIn: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoClientIn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoClientIn: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoClientIn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoClientIn: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -2548,16 +2562,16 @@ int main(int argc, char* argv[]) { const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoClientUn: connected to '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoClientUn: connected to '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoClientUn: disabled"; + snode::semantic::appLog().info() << "EchoClientUn: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoClientUn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoClientUn: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoClientUn: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoClientUn: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -2578,16 +2592,16 @@ int main(int argc, char* argv[]) { const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "EchoClientRc: connected to '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "EchoClientRc: connected to '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "EchoClientRc: disabled"; + snode::semantic::appLog().info() << "EchoClientRc: disabled"; break; case core::socket::State::ERROR: - LOG(ERROR) << "EchoClientRc: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().error() << "EchoClientRc: " << socketAddress.toString() << ": " << state.what(); break; case core::socket::State::FATAL: - LOG(FATAL) << "EchoClientRc: " << socketAddress.toString() << ": " << state.what(); + snode::semantic::appLog().critical() << "EchoClientRc: " << socketAddress.toString() << ": " << state.what(); break; } }); @@ -2638,7 +2652,7 @@ The use of X.509 certificates for encrypted communication is demonstrated also. #include #include #include -#include +#include #include int main(int argc, char* argv[]) { @@ -2658,23 +2672,23 @@ int main(int argc, char* argv[]) { configLegacyApp.required(legacyHtmlRoot); legacyApp.setOnConnected([legacyApp, legacyHtmlRoot](SocketConnection* socketConnection) -> void { // onConnect - LOG(INFO) << "OnConnected " << legacyApp.getConfig().getInstanceName(); + snode::semantic::appLog().info() << "OnConnected " << legacyApp.getConfig().getInstanceName(); legacyApp.use(express::middleware::StaticMiddleware(legacyHtmlRoot->as())); }); legacyApp.listen(8080, [](const SocketAddressRc& socketAddress, const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "LegacyWebApp: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "LegacyWebApp: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "LegacyWebApp: disabled"; + snode::semantic::appLog().info() << "LegacyWebApp: disabled"; break; case core::socket::State::ERROR: - VLOG(1) << "LegacyWebApp: non critical error occurred"; + snode::semantic::appLog().warn() << "LegacyWebApp: non critical error occurred"; break; case core::socket::State::FATAL: - VLOG(1) << "LegacyWebApp: critical error occurred"; + snode::semantic::appLog().error() << "LegacyWebApp: critical error occurred"; break; } }); @@ -2691,7 +2705,7 @@ int main(int argc, char* argv[]) { configTlsApp.required(tlsHtmlRoot); tlsApp.setOnConnected([tlsApp, tlsHtmlRoot](SocketConnection* socketConnection) -> void { // onConnect - LOG(INFO) << "OnConnected " << tlsApp.getConfig().getInstanceName(); + snode::semantic::appLog().info() << "OnConnected " << tlsApp.getConfig().getInstanceName(); tlsApp.use(express::middleware::StaticMiddleware(tlsHtmlRoot->as())); }); @@ -2702,16 +2716,16 @@ int main(int argc, char* argv[]) { tlsApp.listen(8088, [](const SocketAddressRc& socketAddress, const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "TLSWebApp: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "TLSWebApp: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "TLSWebApp: disabled"; + snode::semantic::appLog().info() << "TLSWebApp: disabled"; break; case core::socket::State::ERROR: - VLOG(1) << "TLSWebApp: non critical error occurred"; + snode::semantic::appLog().warn() << "TLSWebApp: non critical error occurred"; break; case core::socket::State::FATAL: - VLOG(1) << "TLSWebApp: critical error occurred"; + snode::semantic::appLog().error() << "TLSWebApp: critical error occurred"; break; } }); @@ -2727,7 +2741,7 @@ The high-level web API provides the methods `get()`, `post()`, `put()`, etc like ```cpp #include #include -#include +#include int main(int argc, char* argv[]) { express::WebApp::init(argc, argv); @@ -2788,16 +2802,16 @@ int main(int argc, char* argv[]) { legacyApp.listen(8080, [](const SocketAddressRc& socketAddress, const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "LegacyWebApp: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "LegacyWebApp: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "LegacyWebApp: disabled"; + snode::semantic::appLog().info() << "LegacyWebApp: disabled"; break; case core::socket::State::ERROR: - VLOG(1) << "LegacyWebApp: non critical error occurred"; + snode::semantic::appLog().warn() << "LegacyWebApp: non critical error occurred"; break; case core::socket::State::FATAL: - VLOG(1) << "LegacyWebApp: critical error occurred"; + snode::semantic::appLog().error() << "LegacyWebApp: critical error occurred"; break; } }); @@ -2816,16 +2830,16 @@ int main(int argc, char* argv[]) { tlsApp.listen(8088, [](const SocketAddressRc& socketAddress, const core::socket::State& state) -> void { switch (state) { case core::socket::State::OK: - VLOG(1) << "TLSWebApp: listening on '" << socketAddress.toString() << "'"; + snode::semantic::appLog().info() << "TLSWebApp: listening on '" << socketAddress.toString() << "'"; break; case core::socket::State::DISABLED: - VLOG(1) << "TLSWebApp: disabled"; + snode::semantic::appLog().info() << "TLSWebApp: disabled"; break; case core::socket::State::ERROR: - VLOG(1) << "TLSWebApp: non critical error occurred"; + snode::semantic::appLog().warn() << "TLSWebApp: non critical error occurred"; break; case core::socket::State::FATAL: - VLOG(1) << "TLSWebApp: critical error occurred"; + snode::semantic::appLog().error() << "TLSWebApp: critical error occurred"; break; } }); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ede5d57b3..b9a110b709 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -221,3 +221,9 @@ install( DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/snodec COMPONENT "core" ) + +install( + FILES "${CMAKE_CURRENT_SOURCE_DIR}/SemanticLog.h" + DESTINATION include/snode.c + COMPONENT "logger" +) diff --git a/src/express/express-compat-suite/snodec/0001-add-express-compat-server.patch b/src/express/express-compat-suite/snodec/0001-add-express-compat-server.patch index 8a99401b3b..37b8f303e3 100644 --- a/src/express/express-compat-suite/snodec/0001-add-express-compat-server.patch +++ b/src/express/express-compat-suite/snodec/0001-add-express-compat-server.patch @@ -27,7 +27,7 @@ new file mode 100644 +#include "express/Response.h" +#include "express/Router.h" +#include "express/legacy/in/WebApp.h" -+#include "log/Logger.h" ++#include "SemanticLog.h" + +#include + @@ -263,16 +263,16 @@ new file mode 100644 + [](const express::legacy::in::WebApp::SocketAddress& socketAddress, const core::socket::State& state) { + switch (state) { + case core::socket::State::OK: -+ VLOG(1) << "express-compat listening on '" << socketAddress.toString() << "'"; ++ snode::semantic::appLog().info() << "express-compat listening on '" << socketAddress.toString() << "'"; + break; + case core::socket::State::DISABLED: -+ VLOG(1) << "express-compat disabled"; ++ snode::semantic::appLog().info() << "express-compat disabled"; + break; + case core::socket::State::ERROR: -+ LOG(ERROR) << "express-compat " << socketAddress.toString() << ": " << state.what(); ++ snode::semantic::appLog().error() << "express-compat " << socketAddress.toString() << ": " << state.what(); + break; + case core::socket::State::FATAL: -+ LOG(FATAL) << "express-compat " << socketAddress.toString() << ": " << state.what(); ++ snode::semantic::appLog().critical() << "express-compat " << socketAddress.toString() << ": " << state.what(); + break; + } + }); diff --git a/src/log/Logger.cpp b/src/log/Logger.cpp index 38bce567c5..bcfd5128c0 100644 --- a/src/log/Logger.cpp +++ b/src/log/Logger.cpp @@ -46,7 +46,6 @@ #include "log/SemanticLogger.h" #include "log/detail/SpdlogBackend.h" -#include #include #endif /* DOXYGEN_SHOULD_SKIP_THIS */ @@ -127,24 +126,6 @@ namespace logger { bool Logger::disableColorLog = false; - LogMessage::LogMessage(const Level level, const int verboseLevel, const bool withErrno) - : level(level) - , verboseLevel(verboseLevel) - , withErrno(withErrno) - , enabled(true) - , errnoValue(errno) { - } - - LogMessage::~LogMessage() { - if (enabled) { - backend.emitLegacy(level, message.str(), withErrno, errnoValue); - } - } - - std::ostringstream& LogMessage::stream() { - return message; - } - } // namespace logger std::ostream& Color::operator<<(std::ostream& os, const Code& code) { diff --git a/src/log/Logger.h b/src/log/Logger.h index c61c5d8457..d146b1cccd 100644 --- a/src/log/Logger.h +++ b/src/log/Logger.h @@ -49,7 +49,6 @@ #include #include #include // IWYU pragma: export -#include #include #endif /* DOXYGEN_SHOULD_SKIP_THIS */ @@ -122,54 +121,6 @@ namespace logger { friend std::string Color::operator+(const Color::Code& code, const std::string& string); }; - class LogMessage { - public: - LogMessage(Level level, int verboseLevel = -1, bool withErrno = false); - ~LogMessage(); - - std::ostringstream& stream(); - - private: - Level level; - int verboseLevel; - bool withErrno; - bool enabled; - int errnoValue; - std::ostringstream message; - }; - } // namespace logger -#ifdef SNODEC_DISABLE_LOGLEVEL_LOGGING -#define LOG(level) \ - if (true) { \ - } else \ - ::logger::LogMessage(::logger::Level::level).stream() -#define PLOG(level) \ - if (true) { \ - } else \ - ::logger::LogMessage(::logger::Level::level, -1, true).stream() -#else -#define LOG(level) \ - if (!::logger::Logger::shouldLog(::logger::Level::level)) { \ - } else \ - ::logger::LogMessage(::logger::Level::level).stream() -#define PLOG(level) \ - if (!::logger::Logger::shouldLog(::logger::Level::level)) { \ - } else \ - ::logger::LogMessage(::logger::Level::level, -1, true).stream() -#endif - -#ifdef SNODEC_DISABLE_VERBOSE_LOGGING -#define VLOG(level) \ - if (true) { \ - } else \ - ::logger::LogMessage(::logger::Level::VERBOSE, level).stream() -#else -#define VLOG(level) \ - if (!::logger::Logger::shouldVerbose(level)) { \ - } else \ - ::logger::LogMessage(::logger::Level::VERBOSE, level).stream() -#endif - #endif // LOGGER_LOGGER_H diff --git a/tests/unit/log/CMakeLists.txt b/tests/unit/log/CMakeLists.txt index 1d03ae3a21..942447912d 100644 --- a/tests/unit/log/CMakeLists.txt +++ b/tests/unit/log/CMakeLists.txt @@ -25,10 +25,6 @@ snodec_add_log_test(SemanticLoggerFilteringTest) target_link_libraries(SemanticLoggerFilteringTest PRIVATE snodec-test-support snodec::net snodec::core-socket-stream) set_property(TEST SemanticLoggerFilteringTest APPEND PROPERTY LABELS "filter") -snodec_add_log_test(SemanticLoggerCompatibilityTest) -target_link_libraries(SemanticLoggerCompatibilityTest PRIVATE snodec-test-support snodec::logger) -set_property(TEST SemanticLoggerCompatibilityTest APPEND PROPERTY LABELS "compatibility;legacy") - snodec_add_log_test(SemanticLoggerDisabledPathTest) target_link_libraries(SemanticLoggerDisabledPathTest PRIVATE snodec-test-support snodec::net snodec::core-socket-stream) set_property(TEST SemanticLoggerDisabledPathTest APPEND PROPERTY LABELS "overhead") diff --git a/tests/unit/log/SemanticEndToEndOutputTest.cpp b/tests/unit/log/SemanticEndToEndOutputTest.cpp index 8eba22a88f..52bcb42470 100644 --- a/tests/unit/log/SemanticEndToEndOutputTest.cpp +++ b/tests/unit/log/SemanticEndToEndOutputTest.cpp @@ -132,23 +132,23 @@ int main() { } } - const auto legacyPath = tempLogPath("snodec-semantic-e2e-legacy.log"); + const auto helperPath = tempLogPath("snodec-semantic-e2e-helper.log"); { - LoggerStateGuard guard(legacyPath); - LOG(INFO) << "legacy info still works"; - errno = EACCES; - PLOG(ERROR) << "legacy plog still works"; + LoggerStateGuard guard(helperPath); + snode::semantic::appLog().info() << "semantic info works"; + snode::semantic::sysError(snode::semantic::appLog(), logger::LogLevel::Error, EACCES) + << "semantic system error works"; } - const auto legacyLines = readLines(legacyPath); - std::ostringstream legacyLog; - for (const auto& line : legacyLines) { - legacyLog << line << '\n'; + const auto helperLines = readLines(helperPath); + std::ostringstream helperLog; + for (const auto& line : helperLines) { + helperLog << line << '\n'; } - result.expectTrue(contains(legacyLog.str(), "INFO") && contains(legacyLog.str(), "legacy info still works"), - "legacy LOG still emits through the legacy path"); - result.expectTrue(contains(legacyLog.str(), "ERROR") && contains(legacyLog.str(), "legacy plog still works") && - contains(legacyLog.str(), "Permission denied"), - "legacy PLOG still appends errno text through the legacy path"); + result.expectTrue(contains(helperLog.str(), "INFO") && contains(helperLog.str(), "semantic info works"), + "semantic application helper emits through the backend"); + result.expectTrue(contains(helperLog.str(), "ERROR") && contains(helperLog.str(), "semantic system error works") && + contains(helperLog.str(), "Permission denied"), + "semantic sysError appends explicit error text"); std::vector identityRecords; auto identityLog = snode::semantic::coreSocketLog( diff --git a/tests/unit/log/SemanticLoggerBackendTest.cpp b/tests/unit/log/SemanticLoggerBackendTest.cpp index adcc639ef0..b51f355694 100644 --- a/tests/unit/log/SemanticLoggerBackendTest.cpp +++ b/tests/unit/log/SemanticLoggerBackendTest.cpp @@ -1,3 +1,4 @@ +#include "SemanticLog.h" #include "core/socket/SocketAddress.h" #include "core/socket/stream/SocketConnection.h" #include "core/socket/stream/SocketContext.h" @@ -166,14 +167,15 @@ int main() { LoggerStateGuard guard(semanticPath.string()); logger::Logger::emitSemantic(record(logger::LogLevel::Info, "semantic info emitted")); logger::Logger::emitSemantic(record(logger::LogLevel::Off, "semantic off hidden")); - LOG(INFO) << "legacy macro emitted"; + snode::semantic::appLog().info() << "semantic helper emitted"; } const auto semanticLog = readFile(semanticPath); result.expectTrue(semanticLog.find("INFO") != std::string::npos, "semantic info maps to legacy INFO label"); result.expectTrue(semanticLog.find("semantic info emitted") != std::string::npos, "semantic info emits through file backend"); result.expectTrue(semanticLog.find("semantic off hidden") == std::string::npos, "semantic off emits nothing"); result.expectTrue(semanticLog.find("BACKENDTICK000") != std::string::npos, "semantic emission uses legacy tick resolver pattern"); - result.expectTrue(semanticLog.find("legacy macro emitted") != std::string::npos, "legacy LOG macro still emits through backend"); + result.expectTrue(semanticLog.find("semantic helper emitted") != std::string::npos, + "semantic application helper emits through backend"); const auto filteredPath = tempLogPath("snodec-backend-filtered.log"); { diff --git a/tests/unit/log/SemanticLoggerCompatibilityTest.cpp b/tests/unit/log/SemanticLoggerCompatibilityTest.cpp deleted file mode 100644 index c35faab4a0..0000000000 --- a/tests/unit/log/SemanticLoggerCompatibilityTest.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "log/Logger.h" -#include "log/SemanticLogger.h" -#include "tests/support/TestResult.h" - -#include -#include -#include -#include -#include -#include - -namespace { - class StateGuard { - public: - explicit StateGuard(const std::string& logFile) - : savedErrno(errno) { - logger::Logger::init(); - logger::LogManager::init(); - logger::Logger::setLogLevel(6); - logger::Logger::setVerboseLevel(0); - logger::Logger::setQuiet(true); - logger::Logger::setDisableColor(true); - logger::Logger::logToFile(logFile); - } - - ~StateGuard() { - logger::Logger::disableLogToFile(); - logger::Logger::init(); - logger::LogManager::init(); - errno = savedErrno; - } - - private: - int savedErrno; - }; - - std::filesystem::path tempLogPath(const std::string& name) { - auto path = std::filesystem::temp_directory_path() / name; - std::error_code error; - std::filesystem::remove(path, error); - std::filesystem::remove(path.string() + ".1", error); - return path; - } - - std::string readFile(const std::filesystem::path& path) { - std::ifstream input(path); - return std::string(std::istreambuf_iterator(input), std::istreambuf_iterator()); - } - - logger::LogScope scope() { - return {logger::LogOrigin::Framework, - logger::LogBoundary::System, - "compatibility.component", - "compatibility-instance", - logger::LogRole::Server, - "compatibility-connection"}; - } - - std::chrono::system_clock::time_point fixedTimestamp() { - return std::chrono::system_clock::time_point{std::chrono::seconds{1783254896}}; - } -} // namespace - -int main() { - tests::support::TestResult result; - - const auto legacyPath = tempLogPath("snodec-semantic-compatibility-legacy.log"); - { - StateGuard guard(legacyPath.string()); - LOG(INFO) << "legacy info"; - errno = EACCES; - PLOG(ERROR) << "legacy plog"; - logger::Logger::setVerboseLevel(1); - logger::Logger::setLogLevel(3); - LOG(INFO) << "numeric info hidden"; - LOG(WARNING) << "numeric warning visible"; - } - const std::string legacyLog = readFile(legacyPath); - result.expectTrue(legacyLog.find("legacy info") != std::string::npos, "legacy LOG remains functional"); - result.expectTrue(legacyLog.find("legacy plog") != std::string::npos && - legacyLog.find("Permission denied") != std::string::npos, - "legacy PLOG remains functional and preserves errno text"); - result.expectTrue(legacyLog.find("numeric info hidden") == std::string::npos && - legacyLog.find("numeric warning visible") != std::string::npos, - "legacy numeric thresholds retain their behavior"); - - const auto semanticOffPath = tempLogPath("snodec-semantic-compatibility-off.log"); - { - StateGuard guard(semanticOffPath.string()); - logger::LogManager::setGlobalLevel(logger::LogLevel::Off); - logger::LogManager::freeze(); - LOG(ERROR) << "legacy unaffected by semantic off"; - logger::BoundaryLogger::createForTest(scope(), logger::Logger::semanticSink(), logger::LogLevel::Off, fixedTimestamp) - .error("semantic filtered by off"); - } - const std::string semanticOffLog = readFile(semanticOffPath); - result.expectTrue(semanticOffLog.find("legacy unaffected by semantic off") != std::string::npos && - semanticOffLog.find("semantic filtered by off") == std::string::npos, - "semantic Off does not disable legacy output"); - - const auto coexistencePath = tempLogPath("snodec-semantic-compatibility-coexistence.log"); - { - StateGuard guard(coexistencePath.string()); - logger::LogManager::setGlobalLevel(logger::LogLevel::Trace); - logger::LogManager::freeze(); - logger::Logger::setLogLevel(2); - LOG(INFO) << "legacy info remains filtered"; - logger::BoundaryLogger::createForTest(scope(), logger::Logger::semanticSink(), logger::LogLevel::Trace, fixedTimestamp) - .info("accepted semantic info"); - } - const std::string coexistenceLog = readFile(coexistencePath); - result.expectTrue(coexistenceLog.find("legacy info remains filtered") == std::string::npos && - coexistenceLog.find("accepted semantic info") != std::string::npos, - "legacy thresholds do not re-filter accepted semantic records"); - - return result.processResult(); -} diff --git a/tests/unit/log/SemanticLoggerFilteringTest.cpp b/tests/unit/log/SemanticLoggerFilteringTest.cpp index 1c45c50b3e..0d9c00f186 100644 --- a/tests/unit/log/SemanticLoggerFilteringTest.cpp +++ b/tests/unit/log/SemanticLoggerFilteringTest.cpp @@ -178,17 +178,11 @@ int main() { logger::Logger::setLogLevel(3); logger::Logger::emitSemantic(record(logger::LogLevel::Info, "backend info hidden")); logger::Logger::emitSemantic(record(logger::LogLevel::Warn, "backend warn visible")); - LOG(INFO) << "legacy info hidden"; - LOG(WARNING) << "legacy warning visible"; } const auto gateLog = readFile(gatePath); result.expectTrue(gateLog.find("backend info hidden") != std::string::npos, "semantic records accepted by LogManager are not double-gated by Logger::setLogLevel"); result.expectTrue(gateLog.find("backend warn visible") != std::string::npos, "semantic warning still emits after semantic filtering"); - result.expectTrue(gateLog.find("legacy info hidden") == std::string::npos && - gateLog.find("legacy warning visible") != std::string::npos, - "legacy LOG macro behavior remains unchanged"); - const auto jsonPath = tempLogPath("snodec-filtering-json-format.log"); { LoggerStateGuard guard(jsonPath.string());