Hide lifecycle logs for fast operations

This commit is contained in:
世界
2026-04-21 17:15:16 +08:00
parent 71f6a2ab4e
commit 83d3a6d4e1
6 changed files with 49 additions and 65 deletions

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"os" "os"
"sync" "sync"
"time"
"github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/common/taskmonitor" "github.com/sagernet/sing-box/common/taskmonitor"
@@ -48,13 +47,12 @@ func (m *Manager) Start(stage adapter.StartStage) error {
} }
for _, endpoint := range m.endpoints { for _, endpoint := range m.endpoints {
name := "endpoint/" + endpoint.Type() + "[" + endpoint.Tag() + "]" name := "endpoint/" + endpoint.Type() + "[" + endpoint.Tag() + "]"
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err := adapter.LegacyStart(endpoint, stage) err := adapter.LegacyStart(endpoint, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
return nil return nil
} }
@@ -72,14 +70,13 @@ func (m *Manager) Close() error {
var err error var err error
for _, endpoint := range endpoints { for _, endpoint := range endpoints {
name := "endpoint/" + endpoint.Type() + "[" + endpoint.Tag() + "]" name := "endpoint/" + endpoint.Type() + "[" + endpoint.Tag() + "]"
m.logger.Trace("close ", name) done := adapter.LogElapsed(m.logger, "close ", name)
startTime := time.Now()
monitor.Start("close ", name) monitor.Start("close ", name)
err = E.Append(err, endpoint.Close(), func(err error) error { err = E.Append(err, endpoint.Close(), func(err error) error {
return E.Cause(err, "close ", name) return E.Cause(err, "close ", name)
}) })
monitor.Finish() monitor.Finish()
adapter.LogElapsed(m.logger, startTime, "close ", name) done()
} }
return nil return nil
} }
@@ -130,13 +127,12 @@ func (m *Manager) Create(ctx context.Context, router adapter.Router, logger log.
if m.started { if m.started {
name := "endpoint/" + endpoint.Type() + "[" + endpoint.Tag() + "]" name := "endpoint/" + endpoint.Type() + "[" + endpoint.Tag() + "]"
for _, stage := range adapter.ListStartStages { for _, stage := range adapter.ListStartStages {
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err = adapter.LegacyStart(endpoint, stage) err = adapter.LegacyStart(endpoint, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
} }
if existsEndpoint, loaded := m.endpointByTag[tag]; loaded { if existsEndpoint, loaded := m.endpointByTag[tag]; loaded {

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"os" "os"
"sync" "sync"
"time"
"github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/common/taskmonitor" "github.com/sagernet/sing-box/common/taskmonitor"
@@ -47,13 +46,12 @@ func (m *Manager) Start(stage adapter.StartStage) error {
m.access.Unlock() m.access.Unlock()
for _, inbound := range inbounds { for _, inbound := range inbounds {
name := "inbound/" + inbound.Type() + "[" + inbound.Tag() + "]" name := "inbound/" + inbound.Type() + "[" + inbound.Tag() + "]"
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err := adapter.LegacyStart(inbound, stage) err := adapter.LegacyStart(inbound, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
return nil return nil
} }
@@ -71,14 +69,13 @@ func (m *Manager) Close() error {
var err error var err error
for _, inbound := range inbounds { for _, inbound := range inbounds {
name := "inbound/" + inbound.Type() + "[" + inbound.Tag() + "]" name := "inbound/" + inbound.Type() + "[" + inbound.Tag() + "]"
m.logger.Trace("close ", name) done := adapter.LogElapsed(m.logger, "close ", name)
startTime := time.Now()
monitor.Start("close ", name) monitor.Start("close ", name)
err = E.Append(err, inbound.Close(), func(err error) error { err = E.Append(err, inbound.Close(), func(err error) error {
return E.Cause(err, "close ", name) return E.Cause(err, "close ", name)
}) })
monitor.Finish() monitor.Finish()
adapter.LogElapsed(m.logger, startTime, "close ", name) done()
} }
return nil return nil
} }
@@ -132,13 +129,12 @@ func (m *Manager) Create(ctx context.Context, router adapter.Router, logger log.
if m.started { if m.started {
name := "inbound/" + inbound.Type() + "[" + inbound.Tag() + "]" name := "inbound/" + inbound.Type() + "[" + inbound.Tag() + "]"
for _, stage := range adapter.ListStartStages { for _, stage := range adapter.ListStartStages {
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err = adapter.LegacyStart(inbound, stage) err = adapter.LegacyStart(inbound, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
} }
if existsInbound, loaded := m.inboundByTag[tag]; loaded { if existsInbound, loaded := m.inboundByTag[tag]; loaded {

View File

@@ -77,33 +77,38 @@ func getServiceName(service any) string {
func Start(logger log.ContextLogger, stage StartStage, services ...Lifecycle) error { func Start(logger log.ContextLogger, stage StartStage, services ...Lifecycle) error {
for _, service := range services { for _, service := range services {
name := getServiceName(service) name := getServiceName(service)
logger.Trace(stage, " ", name) done := LogElapsed(logger, stage, " ", name)
startTime := time.Now()
err := service.Start(stage) err := service.Start(stage)
done()
if err != nil { if err != nil {
return err return err
} }
LogElapsed(logger, startTime, stage, " ", name)
} }
return nil return nil
} }
func StartNamed(logger log.ContextLogger, stage StartStage, services []LifecycleService) error { func StartNamed(logger log.ContextLogger, stage StartStage, services []LifecycleService) error {
for _, service := range services { for _, service := range services {
logger.Trace(stage, " ", service.Name()) done := LogElapsed(logger, stage, " ", service.Name())
startTime := time.Now()
err := service.Start(stage) err := service.Start(stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage.String(), " ", service.Name()) return E.Cause(err, stage.String(), " ", service.Name())
} }
LogElapsed(logger, startTime, stage, " ", service.Name())
} }
return nil return nil
} }
func LogElapsed(logger log.ContextLogger, startTime time.Time, description ...any) { func LogElapsed(logger log.ContextLogger, description ...any) func() {
duration := time.Since(startTime) prefix := F.ToString(description...)
if duration > time.Second { startTime := time.Now()
logger.Trace(append(description, " completed (", F.Seconds(duration.Seconds()), "s)")...) timer := time.AfterFunc(time.Second, func() {
logger.Trace(prefix, "...")
})
return func() {
if timer.Stop() {
return
}
logger.Trace(prefix, " completed (", F.Seconds(time.Since(startTime).Seconds()), "s)")
} }
} }

View File

@@ -6,7 +6,6 @@ import (
"os" "os"
"strings" "strings"
"sync" "sync"
"time"
"github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/common/taskmonitor" "github.com/sagernet/sing-box/common/taskmonitor"
@@ -83,13 +82,12 @@ func (m *Manager) Start(stage adapter.StartStage) error {
m.access.Unlock() m.access.Unlock()
for _, outbound := range outbounds { for _, outbound := range outbounds {
name := "outbound/" + outbound.Type() + "[" + outbound.Tag() + "]" name := "outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err := adapter.LegacyStart(outbound, stage) err := adapter.LegacyStart(outbound, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
} }
return nil return nil
@@ -116,27 +114,25 @@ func (m *Manager) startOutbounds(outbounds []adapter.Outbound) error {
canContinue = true canContinue = true
name := "outbound/" + outboundToStart.Type() + "[" + outboundTag + "]" name := "outbound/" + outboundToStart.Type() + "[" + outboundTag + "]"
if starter, isStarter := outboundToStart.(adapter.Lifecycle); isStarter { if starter, isStarter := outboundToStart.(adapter.Lifecycle); isStarter {
m.logger.Trace("start ", name) done := adapter.LogElapsed(m.logger, "start ", name)
startTime := time.Now()
monitor.Start("start ", name) monitor.Start("start ", name)
err := starter.Start(adapter.StartStateStart) err := starter.Start(adapter.StartStateStart)
monitor.Finish() monitor.Finish()
done()
if err != nil { if err != nil {
return E.Cause(err, "start ", name) return E.Cause(err, "start ", name)
} }
adapter.LogElapsed(m.logger, startTime, "start ", name)
} else if starter, isStarter := outboundToStart.(interface { } else if starter, isStarter := outboundToStart.(interface {
Start() error Start() error
}); isStarter { }); isStarter {
m.logger.Trace("start ", name) done := adapter.LogElapsed(m.logger, "start ", name)
startTime := time.Now()
monitor.Start("start ", name) monitor.Start("start ", name)
err := starter.Start() err := starter.Start()
monitor.Finish() monitor.Finish()
done()
if err != nil { if err != nil {
return E.Cause(err, "start ", name) return E.Cause(err, "start ", name)
} }
adapter.LogElapsed(m.logger, startTime, "start ", name)
} }
} }
if len(started) == len(outbounds) { if len(started) == len(outbounds) {
@@ -184,14 +180,13 @@ func (m *Manager) Close() error {
for _, outbound := range outbounds { for _, outbound := range outbounds {
if closer, isCloser := outbound.(io.Closer); isCloser { if closer, isCloser := outbound.(io.Closer); isCloser {
name := "outbound/" + outbound.Type() + "[" + outbound.Tag() + "]" name := "outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
m.logger.Trace("close ", name) done := adapter.LogElapsed(m.logger, "close ", name)
startTime := time.Now()
monitor.Start("close ", name) monitor.Start("close ", name)
err = E.Append(err, closer.Close(), func(err error) error { err = E.Append(err, closer.Close(), func(err error) error {
return E.Cause(err, "close ", name) return E.Cause(err, "close ", name)
}) })
monitor.Finish() monitor.Finish()
adapter.LogElapsed(m.logger, startTime, "close ", name) done()
} }
} }
return nil return nil
@@ -274,13 +269,12 @@ func (m *Manager) Create(ctx context.Context, router adapter.Router, logger log.
if m.started { if m.started {
name := "outbound/" + outbound.Type() + "[" + outbound.Tag() + "]" name := "outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
for _, stage := range adapter.ListStartStages { for _, stage := range adapter.ListStartStages {
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err = adapter.LegacyStart(outbound, stage) err = adapter.LegacyStart(outbound, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
} }
m.access.Lock() m.access.Lock()

View File

@@ -4,7 +4,6 @@ import (
"context" "context"
"os" "os"
"sync" "sync"
"time"
"github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/adapter"
"github.com/sagernet/sing-box/common/taskmonitor" "github.com/sagernet/sing-box/common/taskmonitor"
@@ -45,13 +44,12 @@ func (m *Manager) Start(stage adapter.StartStage) error {
m.access.Unlock() m.access.Unlock()
for _, service := range services { for _, service := range services {
name := "service/" + service.Type() + "[" + service.Tag() + "]" name := "service/" + service.Type() + "[" + service.Tag() + "]"
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err := adapter.LegacyStart(service, stage) err := adapter.LegacyStart(service, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
return nil return nil
} }
@@ -69,14 +67,13 @@ func (m *Manager) Close() error {
var err error var err error
for _, service := range services { for _, service := range services {
name := "service/" + service.Type() + "[" + service.Tag() + "]" name := "service/" + service.Type() + "[" + service.Tag() + "]"
m.logger.Trace("close ", name) done := adapter.LogElapsed(m.logger, "close ", name)
startTime := time.Now()
monitor.Start("close ", name) monitor.Start("close ", name)
err = E.Append(err, service.Close(), func(err error) error { err = E.Append(err, service.Close(), func(err error) error {
return E.Cause(err, "close ", name) return E.Cause(err, "close ", name)
}) })
monitor.Finish() monitor.Finish()
adapter.LogElapsed(m.logger, startTime, "close ", name) done()
} }
return nil return nil
} }
@@ -127,13 +124,12 @@ func (m *Manager) Create(ctx context.Context, logger log.ContextLogger, tag stri
if m.started { if m.started {
name := "service/" + service.Type() + "[" + service.Tag() + "]" name := "service/" + service.Type() + "[" + service.Tag() + "]"
for _, stage := range adapter.ListStartStages { for _, stage := range adapter.ListStartStages {
m.logger.Trace(stage, " ", name) done := adapter.LogElapsed(m.logger, stage, " ", name)
startTime := time.Now()
err = adapter.LegacyStart(service, stage) err = adapter.LegacyStart(service, stage)
done()
if err != nil { if err != nil {
return E.Cause(err, stage, " ", name) return E.Cause(err, stage, " ", name)
} }
adapter.LogElapsed(m.logger, startTime, stage, " ", name)
} }
} }
if existsService, loaded := m.serviceByTag[tag]; loaded { if existsService, loaded := m.serviceByTag[tag]; loaded {

15
box.go
View File

@@ -515,27 +515,24 @@ func (s *Box) Close() error {
{"dns-transport", s.dnsTransport}, {"dns-transport", s.dnsTransport},
{"network", s.network}, {"network", s.network},
} { } {
s.logger.Trace("close ", closeItem.name) done := adapter.LogElapsed(s.logger, "close ", closeItem.name)
startTime := time.Now()
err = E.Append(err, closeItem.service.Close(), func(err error) error { err = E.Append(err, closeItem.service.Close(), func(err error) error {
return E.Cause(err, "close ", closeItem.name) return E.Cause(err, "close ", closeItem.name)
}) })
adapter.LogElapsed(s.logger, startTime, "close ", closeItem.name) done()
} }
for _, lifecycleService := range s.internalService { for _, lifecycleService := range s.internalService {
s.logger.Trace("close ", lifecycleService.Name()) done := adapter.LogElapsed(s.logger, "close ", lifecycleService.Name())
startTime := time.Now()
err = E.Append(err, lifecycleService.Close(), func(err error) error { err = E.Append(err, lifecycleService.Close(), func(err error) error {
return E.Cause(err, "close ", lifecycleService.Name()) return E.Cause(err, "close ", lifecycleService.Name())
}) })
adapter.LogElapsed(s.logger, startTime, "close ", lifecycleService.Name()) done()
} }
s.logger.Trace("close logger") done := adapter.LogElapsed(s.logger, "close logger")
startTime := time.Now()
err = E.Append(err, s.logFactory.Close(), func(err error) error { err = E.Append(err, s.logFactory.Close(), func(err error) error {
return E.Cause(err, "close logger") return E.Cause(err, "close logger")
}) })
adapter.LogElapsed(s.logger, startTime, "close logger") done()
return err return err
} }