tailscale/tailscale · error
set profile failed: %w
Error message
set profile failed: %w
What it means
Raised by startNewLogger when binding the new audit logger to the current profile ID fails. It wraps the SetProfileID error; the logger cannot persist entries without a profile.
Source
Thrown at ipn/auditlog/extension.go:99
return nil, fmt.Errorf("%T cannot be used as transport", cc)
}
// Create a new log store if this is the first logger.
// Otherwise, get the existing log store.
store, err := e.store.GetErr(func() (LogStore, error) {
return newDefaultLogStore(e.logf)
})
if err != nil {
return nil, fmt.Errorf("failed to create audit log store: %w", err)
}
logger := NewLogger(Opts{
Logf: e.logf,
RetryLimit: 32,
Store: store,
})
if err := logger.SetProfileID(profileID); err != nil {
return nil, fmt.Errorf("set profile failed: %w", err)
}
if err := logger.Start(transport); err != nil {
return nil, fmt.Errorf("start failed: %w", err)
}
return logger, nil
}
func (e *extension) controlClientChanged(cc controlclient.Client, profile ipn.LoginProfileView) (cleanup func()) {
logger, err := e.startNewLogger(cc, profile.ID())
e.mu.Lock()
e.logger = logger // nil on error
e.mu.Unlock()
if err != nil {
// If we fail to create or start the logger, log the error
// and return a nil cleanup function. There's nothing more
// we can do here.
//
// But [extension.getCurrentLogger] returns [noCurrentLogger]View on GitHub (pinned to 6e0912f979)
Solutions
- Create a fresh logger per profile rather than reusing one.
- Check the store for corruption.
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at ipn/auditlog/extension.go:99 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18).
Data as JSON: /api/errors/beb6dd36029989bd.
Report an issue: GitHub.