aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/sessions/inprocsessionlogsink.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenserver/sessions/inprocsessionlogsink.cpp')
-rw-r--r--src/zenserver/sessions/inprocsessionlogsink.cpp37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/zenserver/sessions/inprocsessionlogsink.cpp b/src/zenserver/sessions/inprocsessionlogsink.cpp
index 04c5f7312..c935522bc 100644
--- a/src/zenserver/sessions/inprocsessionlogsink.cpp
+++ b/src/zenserver/sessions/inprocsessionlogsink.cpp
@@ -12,28 +12,31 @@ static constexpr uint64_t UnixEpochBiasSeconds = uint64_t(double(1970 - 1) * 365
static DateTime
TimePointToDateTime(logging::LogClock::time_point Time)
{
- auto Duration = Time.time_since_epoch();
- auto Seconds = std::chrono::duration_cast<std::chrono::seconds>(Duration);
- uint64_t Ticks = (UnixEpochBiasSeconds + static_cast<uint64_t>(Seconds.count())) * TimeSpan::TicksPerSecond;
- return DateTime{Ticks};
+ // DateTime ticks are 100 ns each. Splitting the time_point into whole-second
+ // and sub-second parts and converting both lets us preserve sub-second
+ // precision; the previous implementation truncated to seconds, which made
+ // every entry land at .000 ms in tail / dashboard renderings.
+ auto Duration = Time.time_since_epoch();
+ auto Seconds = std::chrono::duration_cast<std::chrono::seconds>(Duration);
+ auto SubSecondNanos = std::chrono::duration_cast<std::chrono::nanoseconds>(Duration - Seconds);
+ uint64_t SecondsTicks = (UnixEpochBiasSeconds + static_cast<uint64_t>(Seconds.count())) * TimeSpan::TicksPerSecond;
+ uint64_t SubSecondTicks = static_cast<uint64_t>(SubSecondNanos.count()) / static_cast<uint64_t>(TimeSpan::NanosecondsPerTick);
+ return DateTime{SecondsTicks + SubSecondTicks};
}
void
InProcSessionLogSink::Log(const logging::LogMessage& Msg)
{
- Ref<SessionsService::Session> Session = m_Service.GetSession(m_SessionId);
- if (!Session)
- {
- return;
- }
-
- SessionsService::LogEntry Entry{
- .Timestamp = TimePointToDateTime(Msg.GetTime()),
- .Level = std::string(logging::ToString(Msg.GetLevel())),
- .Message = std::string(Msg.GetPayload()),
- };
-
- Session->AppendLog(std::move(Entry));
+ // Route through the service-level AppendLog so the log-appended
+ // callback fires — otherwise WS subscribers tailing the self-session
+ // don't see in-proc lines until they reload and re-fetch via HTTP.
+ m_Service.AppendLog(m_SessionId,
+ SessionsService::LogEntryInput{
+ .Timestamp = TimePointToDateTime(Msg.GetTime()),
+ .Level = Msg.GetLevel(),
+ .LoggerName = Msg.GetLoggerName(),
+ .Message = Msg.GetPayload(),
+ });
}
} // namespace zen