Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 90 additions & 76 deletions README.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -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 <nlohmann/json.hpp>
+
Expand Down Expand Up @@ -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;
+ }
+ });
Expand Down
19 changes: 0 additions & 19 deletions src/log/Logger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
#include "log/SemanticLogger.h"
#include "log/detail/SpdlogBackend.h"

#include <cerrno>
#include <utility>

#endif /* DOXYGEN_SHOULD_SKIP_THIS */
Expand Down Expand Up @@ -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) {
Expand Down
49 changes: 0 additions & 49 deletions src/log/Logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
#include <functional>
#include <memory>
#include <ostream> // IWYU pragma: export
#include <sstream>
#include <string>

#endif /* DOXYGEN_SHOULD_SKIP_THIS */
Expand Down Expand Up @@ -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
4 changes: 0 additions & 4 deletions tests/unit/log/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
28 changes: 14 additions & 14 deletions tests/unit/log/SemanticEndToEndOutputTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<logger::LogRecord> identityRecords;
auto identityLog = snode::semantic::coreSocketLog(
Expand Down
6 changes: 4 additions & 2 deletions tests/unit/log/SemanticLoggerBackendTest.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "SemanticLog.h"
#include "core/socket/SocketAddress.h"
#include "core/socket/stream/SocketConnection.h"
#include "core/socket/stream/SocketContext.h"
Expand Down Expand Up @@ -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");
{
Expand Down
117 changes: 0 additions & 117 deletions tests/unit/log/SemanticLoggerCompatibilityTest.cpp

This file was deleted.

6 changes: 0 additions & 6 deletions tests/unit/log/SemanticLoggerFilteringTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
Loading