From 5c8126c2e691f9607153fb1aedaa360c5460b1c2 Mon Sep 17 00:00:00 2001 From: yusing Date: Sun, 8 Feb 2026 09:20:01 +0800 Subject: [PATCH] refactor(route/logging): streamline log messages with EmbedObject for improved clarity Updated logging statements across multiple files to utilize EmbedObject for enhanced context in log messages. This change improves the readability and consistency of log outputs, particularly in health monitoring and route validation processes. --- internal/route/fileserver.go | 3 +- internal/route/route.go | 67 ++++++++++++++++++++-------- internal/route/stream.go | 5 +-- internal/route/stream/debug_debug.go | 2 +- internal/route/stream/errors.go | 4 +- internal/route/stream/tcp_tcp.go | 2 +- internal/route/stream/udp_udp.go | 2 +- internal/types/routes.go | 3 ++ 8 files changed, 59 insertions(+), 29 deletions(-) diff --git a/internal/route/fileserver.go b/internal/route/fileserver.go index 460b73f3..106a6b65 100644 --- a/internal/route/fileserver.go +++ b/internal/route/fileserver.go @@ -120,8 +120,7 @@ func (s *FileServer) Start(parent task.Parent) gperr.Error { if s.UseHealthCheck() { s.HealthMon = monitor.NewMonitor(s) if err := s.HealthMon.Start(s.task); err != nil { - l := log.With().Str("type", "fileserver").Str("name", s.Name()).Logger() - gperr.LogWarn("health monitor error", err, &l) + log.Warn().EmbedObject(s).Err(err).Msg("health monitor error") s.HealthMon = nil } } diff --git a/internal/route/route.go b/internal/route/route.go index 624b0ecc..f5bc5965 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -14,6 +14,7 @@ import ( "sync" "time" + "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/agentpool" config "github.com/yusing/godoxy/internal/config/types" @@ -218,9 +219,7 @@ func (r *Route) validate() gperr.Error { r.Proxmox.Node = nodeName r.Proxmox.VMID = &zero r.Proxmox.VMName = "" - log.Info(). - Str("node", nodeName). - Msgf("found proxmox node for route %q", r.Alias) + log.Info().EmbedObject(r).Msg("found proxmox node") break } @@ -234,17 +233,13 @@ func (r *Route) validate() gperr.Error { r.Proxmox.Node = resource.Node r.Proxmox.VMID = &vmid r.Proxmox.VMName = resource.Name - log.Info(). - Str("node", resource.Node). - Int("vmid", int(resource.VMID)). - Str("vmname", resource.Name). - Msgf("found proxmox resource for route %q", r.Alias) + log.Info().EmbedObject(r).Msg("found proxmox resource") break } } } if wasNotNil && (r.Proxmox.Node == "" || r.Proxmox.VMID == nil) { - log.Warn().Msgf("no proxmox node / resource found for route %q", r.Alias) + log.Warn().EmbedObject(r).Msg("no proxmox node / resource found") } } @@ -395,7 +390,7 @@ func (r *Route) validateRules() error { } func (r *Route) validateProxmox() { - l := log.With().Str("route", r.Alias).Logger() + l := log.With().EmbedObject(r).Logger() nodeName := r.Proxmox.Node vmid := r.Proxmox.VMID @@ -424,7 +419,7 @@ func (r *Route) validateProxmox() { } else { res, err := node.Client().GetResource("lxc", *vmid) if err != nil { // ErrResourceNotFound - l.Err(err).Msgf("failed to get resource %d", *vmid) + l.Error().Err(err).Msgf("failed to get resource %d", *vmid) return } @@ -443,24 +438,22 @@ func (r *Route) validateProxmox() { return } - l = l.With().Str("container", containerName).Logger() - - l.Info().Msgf("checking if container is running") + l.Info().Str("container", containerName).Msg("checking if container is running") running, err := node.LXCIsRunning(ctx, *vmid) if err != nil { - l.Err(err).Msgf("failed to check container state") + l.Error().Err(err).Msgf("failed to check container state") return } if !running { - l.Info().Msgf("starting container") + l.Info().Msg("starting container") if err := node.LXCAction(ctx, *vmid, proxmox.LXCStart); err != nil { - l.Err(err).Msgf("failed to start container") + l.Error().Err(err).Msg("failed to start container") return } } - l.Info().Msgf("finding reachable ip addresses") + l.Info().Msg("finding reachable ip addresses") errs := gperr.NewBuilder("failed to find reachable ip addresses") for _, ip := range ips { if err := netutils.PingTCP(ctx, ip, r.Port.Proxy); err != nil { @@ -687,6 +680,44 @@ func (r *Route) DisplayName() string { return r.Homepage.Name } +func (r *Route) MarshalZerologObject(e *zerolog.Event) { + e.Str("alias", r.Alias) + switch r := r.impl.(type) { + case *ReveseProxyRoute: + e.Str("type", "reverse_proxy"). + Str("scheme", r.Scheme.String()). + Str("bind", r.LisURL.Host). + Str("target", r.ProxyURL.URL.String()) + case *FileServer: + e.Str("type", "file_server"). + Str("root", r.Root) + case *StreamRoute: + e.Str("type", "stream"). + Str("scheme", r.LisURL.Scheme+"->"+r.ProxyURL.Scheme) + if r.stream != nil { + // listening port could be zero (random), + // use LocalAddr() to get the actual listening host+port. + e.Str("bind", r.stream.LocalAddr().String()) + } else { + // not yet started + e.Str("bind", r.LisURL.Host) + } + e.Str("target", r.ProxyURL.URL.String()) + } + if r.Proxmox != nil { + e.Str("proxmox", r.Proxmox.Node) + if r.Proxmox.VMID != nil { + e.Int("vmid", *r.Proxmox.VMID) + } + if r.Proxmox.VMName != "" { + e.Str("vmname", r.Proxmox.VMName) + } + } + if r.Container != nil { + e.Str("container", r.Container.ContainerName) + } +} + // PreferOver implements pool.Preferable to resolve duplicate route keys deterministically. // Preference policy: // - Prefer routes with rules over routes without rules. diff --git a/internal/route/stream.go b/internal/route/stream.go index 8f285879..3b05cbe2 100755 --- a/internal/route/stream.go +++ b/internal/route/stream.go @@ -6,7 +6,6 @@ import ( "net" "strings" - "github.com/rs/zerolog" entrypoint "github.com/yusing/godoxy/internal/entrypoint/types" "github.com/yusing/godoxy/internal/health/monitor" "github.com/yusing/godoxy/internal/idlewatcher" @@ -21,8 +20,6 @@ import ( type StreamRoute struct { *Route stream nettypes.Stream - - l zerolog.Logger } var _ types.StreamRoute = (*StreamRoute)(nil) @@ -65,7 +62,7 @@ func (r *StreamRoute) Start(parent task.Parent) gperr.Error { if r.HealthMon != nil { if err := r.HealthMon.Start(r.task); err != nil { - gperr.LogWarn("health monitor error", err, &r.l) + gperr.LogWarn("health monitor error", err) r.HealthMon = nil } } diff --git a/internal/route/stream/debug_debug.go b/internal/route/stream/debug_debug.go index 26e814dc..7499ee44 100644 --- a/internal/route/stream/debug_debug.go +++ b/internal/route/stream/debug_debug.go @@ -8,5 +8,5 @@ import ( ) func logDebugf(stream zerolog.LogObjectMarshaler, format string, v ...any) { - log.Debug().Object("stream", stream).Msgf(format, v...) + log.Debug().EmbedObject(stream).Msgf(format, v...) } diff --git a/internal/route/stream/errors.go b/internal/route/stream/errors.go index 79a5dbff..8b54652e 100644 --- a/internal/route/stream/errors.go +++ b/internal/route/stream/errors.go @@ -29,7 +29,7 @@ func logErr(stream zerolog.LogObjectMarshaler, err error, msg string) { if err == nil { return } - log.Err(err).Object("stream", stream).Msg(msg) + log.Err(err).EmbedObject(stream).Msg(msg) } func logErrf(stream zerolog.LogObjectMarshaler, err error, format string, v ...any) { @@ -37,5 +37,5 @@ func logErrf(stream zerolog.LogObjectMarshaler, err error, format string, v ...a if err == nil { return } - log.Err(err).Object("stream", stream).Msgf(format, v...) + log.Err(err).EmbedObject(stream).Msgf(format, v...) } diff --git a/internal/route/stream/tcp_tcp.go b/internal/route/stream/tcp_tcp.go index c65db5f4..a83125d6 100644 --- a/internal/route/stream/tcp_tcp.go +++ b/internal/route/stream/tcp_tcp.go @@ -57,7 +57,7 @@ func (s *TCPTCPStream) ListenAndServe(ctx context.Context, preDial, onRead netty } if acl := acl.FromCtx(ctx); acl != nil { - log.Debug().Str("listener", s.listener.Addr().String()).Msg("wrapping listener with ACL") + log.Debug().EmbedObject(s).Msg("wrapping listener with ACL") s.listener = acl.WrapTCP(s.listener) } diff --git a/internal/route/stream/udp_udp.go b/internal/route/stream/udp_udp.go index 6e2b67bc..e34a39e5 100644 --- a/internal/route/stream/udp_udp.go +++ b/internal/route/stream/udp_udp.go @@ -82,7 +82,7 @@ func (s *UDPUDPStream) ListenAndServe(ctx context.Context, preDial, onRead netty } s.listener = l if acl := acl.FromCtx(ctx); acl != nil { - log.Debug().Str("listener", s.listener.LocalAddr().String()).Msg("wrapping listener with ACL") + log.Debug().EmbedObject(s).Msg("wrapping listener with ACL") s.listener = acl.WrapUDP(s.listener) } s.preDial = preDial diff --git a/internal/types/routes.go b/internal/types/routes.go index 7b3bbb1f..3aad58bf 100644 --- a/internal/types/routes.go +++ b/internal/types/routes.go @@ -3,6 +3,7 @@ package types import ( "net/http" + "github.com/rs/zerolog" "github.com/yusing/godoxy/internal/agentpool" "github.com/yusing/godoxy/internal/homepage" nettypes "github.com/yusing/godoxy/internal/net/types" @@ -18,6 +19,8 @@ type ( task.TaskStarter task.TaskFinisher pool.Object + zerolog.LogObjectMarshaler + ProviderName() string GetProvider() RouteProvider ListenURL() *nettypes.URL