{"record":{"id":"5d663884dd4283ab","repo":"tailscale/tailscale","slug":"start-failed-w","errorCode":null,"errorMessage":"start failed: %w","messagePattern":"start failed: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ipn/auditlog/extension.go","lineNumber":102,"sourceCode":"\t// Create a new log store if this is the first logger.\n\t// Otherwise, get the existing log store.\n\tstore, err := e.store.GetErr(func() (LogStore, error) {\n\t\treturn newDefaultLogStore(e.logf)\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create audit log store: %w\", err)\n\t}\n\n\tlogger := NewLogger(Opts{\n\t\tLogf:       e.logf,\n\t\tRetryLimit: 32,\n\t\tStore:      store,\n\t})\n\tif err := logger.SetProfileID(profileID); err != nil {\n\t\treturn nil, fmt.Errorf(\"set profile failed: %w\", err)\n\t}\n\tif err := logger.Start(transport); err != nil {\n\t\treturn nil, fmt.Errorf(\"start failed: %w\", err)\n\t}\n\treturn logger, nil\n}\n\nfunc (e *extension) controlClientChanged(cc controlclient.Client, profile ipn.LoginProfileView) (cleanup func()) {\n\tlogger, err := e.startNewLogger(cc, profile.ID())\n\te.mu.Lock()\n\te.logger = logger // nil on error\n\te.mu.Unlock()\n\tif err != nil {\n\t\t// If we fail to create or start the logger, log the error\n\t\t// and return a nil cleanup function. There's nothing more\n\t\t// we can do here.\n\t\t//\n\t\t// But [extension.getCurrentLogger] returns [noCurrentLogger]\n\t\t// when the logger is nil. Since [noCurrentLogger] always\n\t\t// fails with [errNoLogger], operations that must be audited\n\t\t// but cannot will fail on platforms where the audit logger","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/ipn/auditlog/extension.go#L84-L120","documentation":"logger.Start failed to begin the flush worker with the given transport, usually because the logger was already started or stopped. The logger is unusable and the extension will not record audit events.","triggerScenarios":"Thrown at ipn/auditlog/extension.go:102 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure Start is called exactly once per logger.","Stop the previous logger before starting a new one on control client change."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}