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