diff --git a/opencloud/pkg/runtime/service/service.go b/opencloud/pkg/runtime/service/service.go index 13b0af8076..c360a623f2 100644 --- a/opencloud/pkg/runtime/service/service.go +++ b/opencloud/pkg/runtime/service/service.go @@ -389,9 +389,16 @@ func Start(ctx context.Context, o ...Option) error { if ev.Restarting { l = s.Log.Error() } - l.Str("event", e.String()).Str("service", ev.ServiceName).Str("supervisor", ev.SupervisorName). - Bool("restarting", ev.Restarting).Float64("failures", ev.CurrentFailures).Float64("threshold", ev.FailureThreshold). - Interface("error", ev.Err).Msg("service terminated") + l = l.Str("event", e.String()).Str("service", ev.ServiceName).Str("supervisor", ev.SupervisorName). + Bool("restarting", ev.Restarting).Float64("failures", ev.CurrentFailures).Float64("threshold", ev.FailureThreshold) + // ev.Err is an interface{}: marshaling an error yields {} because + // its fields are unexported, so the message has to go through Err + if err, ok := ev.Err.(error); ok { + l = l.Err(err) + } else { + l = l.Interface("error", ev.Err) + } + l.Msg("service terminated") case suture.EventBackoff: s.Log.Warn().Str("event", e.String()).Str("supervisor", ev.SupervisorName).Msg("service backoff") case suture.EventResume: diff --git a/pkg/clihelper/app.go b/pkg/clihelper/app.go index e2543faff0..e654165d45 100644 --- a/pkg/clihelper/app.go +++ b/pkg/clihelper/app.go @@ -14,5 +14,17 @@ func DefaultApp(app *cobra.Command) *cobra.Command { // version info app.Version = fmt.Sprintf("%s (%s <%s>) (%s)", version.String, "OpenCloud GmbH", "support@opencloud.eu", version.Compiled()) + // cobra would print the error on top of what main() already prints + app.SilenceErrors = true + + // keep the usage block for flag parse errors, drop it once RunE runs. + // Traversing runs the hook even below a subcommand that brings its own, + // e.g. every service below ServiceCommand. + cobra.EnableTraverseRunHooks = true + app.PersistentPreRunE = func(cmd *cobra.Command, _ []string) error { + cmd.SilenceUsage = true + return nil + } + return app }