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.
This commit is contained in:
yusing
2026-02-08 09:20:01 +08:00
parent 31b4fedf72
commit 5c8126c2e6
8 changed files with 59 additions and 29 deletions

View File

@@ -120,8 +120,7 @@ func (s *FileServer) Start(parent task.Parent) gperr.Error {
if s.UseHealthCheck() { if s.UseHealthCheck() {
s.HealthMon = monitor.NewMonitor(s) s.HealthMon = monitor.NewMonitor(s)
if err := s.HealthMon.Start(s.task); err != nil { if err := s.HealthMon.Start(s.task); err != nil {
l := log.With().Str("type", "fileserver").Str("name", s.Name()).Logger() log.Warn().EmbedObject(s).Err(err).Msg("health monitor error")
gperr.LogWarn("health monitor error", err, &l)
s.HealthMon = nil s.HealthMon = nil
} }
} }

View File

@@ -14,6 +14,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/yusing/godoxy/internal/agentpool" "github.com/yusing/godoxy/internal/agentpool"
config "github.com/yusing/godoxy/internal/config/types" config "github.com/yusing/godoxy/internal/config/types"
@@ -218,9 +219,7 @@ func (r *Route) validate() gperr.Error {
r.Proxmox.Node = nodeName r.Proxmox.Node = nodeName
r.Proxmox.VMID = &zero r.Proxmox.VMID = &zero
r.Proxmox.VMName = "" r.Proxmox.VMName = ""
log.Info(). log.Info().EmbedObject(r).Msg("found proxmox node")
Str("node", nodeName).
Msgf("found proxmox node for route %q", r.Alias)
break break
} }
@@ -234,17 +233,13 @@ func (r *Route) validate() gperr.Error {
r.Proxmox.Node = resource.Node r.Proxmox.Node = resource.Node
r.Proxmox.VMID = &vmid r.Proxmox.VMID = &vmid
r.Proxmox.VMName = resource.Name r.Proxmox.VMName = resource.Name
log.Info(). log.Info().EmbedObject(r).Msg("found proxmox resource")
Str("node", resource.Node).
Int("vmid", int(resource.VMID)).
Str("vmname", resource.Name).
Msgf("found proxmox resource for route %q", r.Alias)
break break
} }
} }
} }
if wasNotNil && (r.Proxmox.Node == "" || r.Proxmox.VMID == nil) { 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() { func (r *Route) validateProxmox() {
l := log.With().Str("route", r.Alias).Logger() l := log.With().EmbedObject(r).Logger()
nodeName := r.Proxmox.Node nodeName := r.Proxmox.Node
vmid := r.Proxmox.VMID vmid := r.Proxmox.VMID
@@ -424,7 +419,7 @@ func (r *Route) validateProxmox() {
} else { } else {
res, err := node.Client().GetResource("lxc", *vmid) res, err := node.Client().GetResource("lxc", *vmid)
if err != nil { // ErrResourceNotFound 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 return
} }
@@ -443,24 +438,22 @@ func (r *Route) validateProxmox() {
return return
} }
l = l.With().Str("container", containerName).Logger() l.Info().Str("container", containerName).Msg("checking if container is running")
l.Info().Msgf("checking if container is running")
running, err := node.LXCIsRunning(ctx, *vmid) running, err := node.LXCIsRunning(ctx, *vmid)
if err != nil { if err != nil {
l.Err(err).Msgf("failed to check container state") l.Error().Err(err).Msgf("failed to check container state")
return return
} }
if !running { if !running {
l.Info().Msgf("starting container") l.Info().Msg("starting container")
if err := node.LXCAction(ctx, *vmid, proxmox.LXCStart); err != nil { 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 return
} }
} }
l.Info().Msgf("finding reachable ip addresses") l.Info().Msg("finding reachable ip addresses")
errs := gperr.NewBuilder("failed to find reachable ip addresses") errs := gperr.NewBuilder("failed to find reachable ip addresses")
for _, ip := range ips { for _, ip := range ips {
if err := netutils.PingTCP(ctx, ip, r.Port.Proxy); err != nil { if err := netutils.PingTCP(ctx, ip, r.Port.Proxy); err != nil {
@@ -687,6 +680,44 @@ func (r *Route) DisplayName() string {
return r.Homepage.Name 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. // PreferOver implements pool.Preferable to resolve duplicate route keys deterministically.
// Preference policy: // Preference policy:
// - Prefer routes with rules over routes without rules. // - Prefer routes with rules over routes without rules.

View File

@@ -6,7 +6,6 @@ import (
"net" "net"
"strings" "strings"
"github.com/rs/zerolog"
entrypoint "github.com/yusing/godoxy/internal/entrypoint/types" entrypoint "github.com/yusing/godoxy/internal/entrypoint/types"
"github.com/yusing/godoxy/internal/health/monitor" "github.com/yusing/godoxy/internal/health/monitor"
"github.com/yusing/godoxy/internal/idlewatcher" "github.com/yusing/godoxy/internal/idlewatcher"
@@ -21,8 +20,6 @@ import (
type StreamRoute struct { type StreamRoute struct {
*Route *Route
stream nettypes.Stream stream nettypes.Stream
l zerolog.Logger
} }
var _ types.StreamRoute = (*StreamRoute)(nil) var _ types.StreamRoute = (*StreamRoute)(nil)
@@ -65,7 +62,7 @@ func (r *StreamRoute) Start(parent task.Parent) gperr.Error {
if r.HealthMon != nil { if r.HealthMon != nil {
if err := r.HealthMon.Start(r.task); err != 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 r.HealthMon = nil
} }
} }

View File

@@ -8,5 +8,5 @@ import (
) )
func logDebugf(stream zerolog.LogObjectMarshaler, format string, v ...any) { func logDebugf(stream zerolog.LogObjectMarshaler, format string, v ...any) {
log.Debug().Object("stream", stream).Msgf(format, v...) log.Debug().EmbedObject(stream).Msgf(format, v...)
} }

View File

@@ -29,7 +29,7 @@ func logErr(stream zerolog.LogObjectMarshaler, err error, msg string) {
if err == nil { if err == nil {
return 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) { 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 { if err == nil {
return return
} }
log.Err(err).Object("stream", stream).Msgf(format, v...) log.Err(err).EmbedObject(stream).Msgf(format, v...)
} }

View File

@@ -57,7 +57,7 @@ func (s *TCPTCPStream) ListenAndServe(ctx context.Context, preDial, onRead netty
} }
if acl := acl.FromCtx(ctx); acl != nil { 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) s.listener = acl.WrapTCP(s.listener)
} }

View File

@@ -82,7 +82,7 @@ func (s *UDPUDPStream) ListenAndServe(ctx context.Context, preDial, onRead netty
} }
s.listener = l s.listener = l
if acl := acl.FromCtx(ctx); acl != nil { 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.listener = acl.WrapUDP(s.listener)
} }
s.preDial = preDial s.preDial = preDial

View File

@@ -3,6 +3,7 @@ package types
import ( import (
"net/http" "net/http"
"github.com/rs/zerolog"
"github.com/yusing/godoxy/internal/agentpool" "github.com/yusing/godoxy/internal/agentpool"
"github.com/yusing/godoxy/internal/homepage" "github.com/yusing/godoxy/internal/homepage"
nettypes "github.com/yusing/godoxy/internal/net/types" nettypes "github.com/yusing/godoxy/internal/net/types"
@@ -18,6 +19,8 @@ type (
task.TaskStarter task.TaskStarter
task.TaskFinisher task.TaskFinisher
pool.Object pool.Object
zerolog.LogObjectMarshaler
ProviderName() string ProviderName() string
GetProvider() RouteProvider GetProvider() RouteProvider
ListenURL() *nettypes.URL ListenURL() *nettypes.URL