netbirdio/netbird · error

failed to set log level: %v

Error message

failed to set log level: %v

What it means

The SetLogLevel RPC to the daemon failed; the CLI prints only status.Convert(err).Message(), so the text is the daemon-side or transport message with the gRPC envelope stripped. Typical causes mirror other daemon RPCs: service stopped, IPC socket unreachable, permission on the socket, or the daemon rejecting the request internally.

Source

Thrown at client/cmd/debug.go:225

	}
	defer func() {
		if err := conn.Close(); err != nil {
			log.Errorf(errCloseConnection, err)
		}
	}()

	client := proto.NewDaemonServiceClient(conn)
	level := server.ParseLogLevel(args[0])
	if level == proto.LogLevel_UNKNOWN {
		//nolint
		return fmt.Errorf("unknown log level: %s. Available levels are: panic, fatal, error, warn, info, debug, trace\n", args[0])
	}

	_, err = client.SetLogLevel(cmd.Context(), &proto.SetLogLevelRequest{
		Level: level,
	})
	if err != nil {
		return fmt.Errorf("failed to set log level: %v", status.Convert(err).Message())
	}

	cmd.Println("Log level set successfully to", args[0])
	return nil
}

func runForDuration(cmd *cobra.Command, args []string) error {
	duration, err := time.ParseDuration(args[0])
	if err != nil {
		return fmt.Errorf("invalid duration format: %v", err)
	}

	anonymizeEnabled, anonymizeLevel, err := effectiveAnonymize()
	if err != nil {
		return err
	}

	conn, err := getClient(cmd)

View on GitHub (pinned to 93e97f4bf1)

Solutions

  1. Confirm the daemon is running (systemctl status netbird / service control) and restart it if it has failed, then retry
  2. Run with the same privileges/user used for other working netbird commands (socket access is user-scoped)
  3. Check the daemon log for the matching timestamp — if it received the RPC, its log holds the real failure
  4. Align CLI and daemon versions after upgrades (netbird version, daemon banner)

Example fix

# before
sudo systemctl stop netbird && netbird debug log-level debug
# -> failed to set log level: ...

# after
sudo systemctl start netbird && netbird debug log-level debug
Defensive patterns

Strategy: retry

Validate before calling

// Cheap health probe before the real call:
if _, err := proto.NewDaemonServiceClient(conn).Status(ctx, &proto.EmptyRequest{}); err != nil {
    return fmt.Errorf("daemon not responding: %v", status.Convert(err).Message())
}

Try / catch

// Retry once after a short delay for restart races:
_, err = client.SetLogLevel(ctx, &proto.SetLogLevelRequest{Level: level})
if err != nil {
    time.Sleep(2 * time.Second)
    _, err = client.SetLogLevel(ctx, &proto.SetLogLevelRequest{Level: level})
}
if err != nil {
    return fmt.Errorf("failed to set log level: %v", status.Convert(err).Message())
}

Prevention

When it happens

Trigger: Daemon not running (service stopped/failed) when netbird debug log-level runs; calling user denied access to the daemon IPC socket; daemon mid-restart or crashed; version mismatch between CLI and daemon for this RPC.

Common situations: Changing log level right after boot before the service is up; running under sudo vs not, hitting socket permissions; containers where the CLI is run outside the daemon's IPC namespace; post-upgrade while the daemon restarts.

Related errors


AI-assisted analysis of netbirdio/netbird@93e97f4bf1 (2026-08-16). Data as JSON: /api/errors/36699910c9679d02. Report an issue: GitHub.