Fix connection logs: add background status.log sync task

ConnLogs were never populated because AppendConnLog was never called.
Added StartStatusSync() goroutine that runs every 10 seconds:

1. Iterates all running instances
2. Reads status.log via ParseStatus (status-version 3)
3. For each CLIENT_LIST entry:
   - If no active ConnLog exists → AppendConnLog (new connection)
   - If active ConnLog exists → UpdateActiveConnStats (traffic)
4. For active ConnLogs with no matching CLIENT_LIST → CloseActiveConn

Store additions:
  ListActiveConns(instanceID)  — returns all unclosed connections
  UpdateActiveConnStats()      — updates bytes in/out without flush

StartStatusSync is called from main.go right after Service creation.
UpdateActiveConnStats deliberately skips flush() to avoid writing
db.json every 10 seconds; stats are persisted on disconnect.
This commit is contained in:
cnbugs
2026-08-09 23:52:17 +08:00
parent f3cda67d9f
commit 19c0b190ea
3 changed files with 83 additions and 0 deletions
+29
View File
@@ -287,6 +287,35 @@ func (s *Store) CloseActiveConn(instanceID, commonName string, at time.Time) err
return nil
}
// ListActiveConns 返回指定实例所有未断开的连接。
func (s *Store) ListActiveConns(instanceID string) []model.ConnectionLog {
s.mu.RLock()
defer s.mu.RUnlock()
var out []model.ConnectionLog
for i := len(s.data.ConnLogs) - 1; i >= 0; i-- {
c := s.data.ConnLogs[i]
if c.InstanceID == instanceID && c.DisconnectedAt == nil {
out = append(out, c)
}
}
return out
}
// UpdateActiveConnStats 更新活跃连接的流量统计。
func (s *Store) UpdateActiveConnStats(instanceID, commonName string, bytesIn, bytesOut int64) error {
s.mu.Lock()
defer s.mu.Unlock()
for i := len(s.data.ConnLogs) - 1; i >= 0; i-- {
c := &s.data.ConnLogs[i]
if c.InstanceID == instanceID && c.CommonName == commonName && c.DisconnectedAt == nil {
c.BytesIn = bytesIn
c.BytesOut = bytesOut
return nil // 不 flush,避免高频写盘
}
}
return nil
}
// ---- Backups ----
func (s *Store) ListBackups() []model.Backup {