diff --git a/README.md b/README.md index 6076404338..ac00f974b6 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(...); @@ -2430,7 +2440,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; @@ -2442,16 +2454,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; } }); @@ -2465,16 +2477,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; } }); @@ -2493,16 +2505,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; } }); @@ -2514,6 +2526,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); @@ -2528,16 +2542,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; } }); @@ -2552,16 +2566,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; } }); @@ -2582,16 +2596,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; } }); @@ -2642,7 +2656,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[]) { @@ -2662,23 +2676,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; } }); @@ -2695,7 +2709,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())); }); @@ -2706,16 +2720,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; } }); @@ -2731,7 +2745,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); @@ -2792,16 +2806,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; } }); @@ -2820,16 +2834,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 24d5281fdc..710f41c531 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -216,3 +216,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/apps/oauth2/client_app/vue-frontend-oauth2-client/package-lock.json b/src/apps/oauth2/client_app/vue-frontend-oauth2-client/package-lock.json index 45475e4749..bd61002685 100644 --- a/src/apps/oauth2/client_app/vue-frontend-oauth2-client/package-lock.json +++ b/src/apps/oauth2/client_app/vue-frontend-oauth2-client/package-lock.json @@ -1087,9 +1087,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { "type": "github", @@ -2010,9 +2010,9 @@ } }, "nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==" }, "normalize-path": { "version": "3.0.0", 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());