diff options
| author | Stefan Boberg <[email protected]> | 2026-03-12 15:03:03 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2026-03-12 15:03:03 +0100 |
| commit | 81bc43aa96f0059cecb28d1bd88338b7d84667f9 (patch) | |
| tree | a3428cb7fddceae0b284d33562af5bf3e64a367e /src/zencore/logging/registry.cpp | |
| parent | update fmt 12.0.0 -> 12.1.0 (#828) (diff) | |
| download | zen-81bc43aa96f0059cecb28d1bd88338b7d84667f9.tar.xz zen-81bc43aa96f0059cecb28d1bd88338b7d84667f9.zip | |
Transparent proxy mode (#823)
Adds a **transparent TCP proxy mode** to zenserver (activated via `zenserver proxy`), allowing it to sit between clients and upstream Zen servers to inspect and monitor HTTP/1.x traffic in real time. Primarily useful during development, to be able to observe multi-server/client interactions in one place.
- **Dedicated proxy port** -- Proxy mode defaults to port 8118 with its own data directory to avoid collisions with a normal zenserver instance.
- **TCP proxy core** (`src/zenserver/proxy/`) -- A new transparent TCP proxy that forwards connections to upstream targets, with support for both TCP/IP and Unix socket listeners. Multi-threaded I/O for connection handling. Supports Unix domain sockets for both upstream/downstream.
- **HTTP traffic inspection** -- Parses HTTP/1.x request/response streams inline to extract method, path, status, content length, and WebSocket upgrades without breaking the proxied data.
- **Proxy dashboard** -- A web UI showing live connection stats, per-target request counts, active connections, bytes transferred, and client IP/session ID rollups.
- **Server mode display** -- Dashboard banner now shows the running server mode (Zen Proxy, Zen Compute, etc.).
Supporting changes included in this branch:
- **Wildcard log level matching** -- Log levels can now be set per-category using wildcard patterns (e.g. `proxy.*=debug`).
- **`zen down --all`** -- New flag to shut down all running zenserver instances; also used by the new `xmake kill` task.
- Minor test stability fixes (flaky hash collisions, per-thread RNG seeds).
- Support ZEN_MALLOC environment variable for default allocator selection and switch default to rpmalloc
- Fixed sentry-native build to allow LTO on Windows
Diffstat (limited to 'src/zencore/logging/registry.cpp')
| -rw-r--r-- | src/zencore/logging/registry.cpp | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/src/zencore/logging/registry.cpp b/src/zencore/logging/registry.cpp index 3ed1fb0df..383a5d8ba 100644 --- a/src/zencore/logging/registry.cpp +++ b/src/zencore/logging/registry.cpp @@ -13,6 +13,44 @@ namespace zen::logging { +bool +MatchLoggerPattern(std::string_view Pattern, std::string_view Name) +{ + size_t Pi = 0; + size_t Ni = 0; + size_t StarPi = std::string_view::npos; + size_t StarNi = 0; + + while (Ni < Name.size()) + { + if (Pi < Pattern.size() && (Pattern[Pi] == Name[Ni] || Pattern[Pi] == '?')) + { + ++Pi; + ++Ni; + } + else if (Pi < Pattern.size() && Pattern[Pi] == '*') + { + StarPi = Pi++; + StarNi = Ni; + } + else if (StarPi != std::string_view::npos) + { + Pi = StarPi + 1; + Ni = ++StarNi; + } + else + { + return false; + } + } + + while (Pi < Pattern.size() && Pattern[Pi] == '*') + { + ++Pi; + } + return Pi == Pattern.size(); +} + struct Registry::Impl { Impl() @@ -95,12 +133,27 @@ struct Registry::Impl } } - for (auto& [LoggerName, Level] : Levels) + for (auto& [Pattern, Level] : Levels) { - auto It = m_Loggers.find(LoggerName); - if (It != m_Loggers.end()) + if (Pattern.find_first_of("*?") == std::string::npos) { - It->second->SetLevel(Level); + // Exact match — fast path via map lookup. + auto It = m_Loggers.find(Pattern); + if (It != m_Loggers.end()) + { + It->second->SetLevel(Level); + } + } + else + { + // Wildcard pattern — iterate all loggers. + for (auto& [Name, CurLogger] : m_Loggers) + { + if (MatchLoggerPattern(Pattern, Name)) + { + CurLogger->SetLevel(Level); + } + } } } } |