diff options
Diffstat (limited to 'src/zenserver/sessions/inprocsessionlogsink.cpp')
| -rw-r--r-- | src/zenserver/sessions/inprocsessionlogsink.cpp | 37 |
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 |