hashicorp/nomad · error

Failed to open Windows eventlog: %w

Error message

Failed to open Windows eventlog: %w

What it means

NewEventLogger opens the Windows event log source named WINDOWS_SERVICE_NAME via the eventlog package; if Open fails (source not registered or insufficient privileges) the error is wrapped and returned, so no event logger can be created.

Source

Thrown at helper/winsvc/event_logger_windows.go:17

// Copyright IBM Corp. 2015, 2026
// SPDX-License-Identifier: BUSL-1.1

package winsvc

import (
	"fmt"
	"io"

	"golang.org/x/sys/windows/svc/eventlog"
)

// NewEventLogger creates a new event logger instance
func NewEventLogger(level string) (io.WriteCloser, error) {
	evtLog, err := eventlog.Open(WINDOWS_SERVICE_NAME)
	if err != nil {
		return nil, fmt.Errorf("Failed to open Windows eventlog: %w", err)
	}

	return &eventLogger{
		evtLog: evtLog,
		level:  EventlogLevelFromString(level),
	}, nil
}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Register the event source once at install time (eventlog.InstallAsEventCreate with WINDOWS_SERVICE_NAME)
  2. Run the service under an account with permission to open the event log
  3. Run on Windows only; guard windows-only logging paths behind runtime/build tags

Example fix

// before
w, err := winsvc.NewEventLogger("INFO") // source not registered
// after
if err := eventlog.InstallAsEventCreate(winsvc.WINDOWS_SERVICE_NAME, eventlog.Error|eventlog.Warning|eventlog.Info); err != nil && !strings.Contains(err.Error(), "already exists") {
	log.Fatal(err)
}
w, err := winsvc.NewEventLogger("INFO")
Defensive patterns

Strategy: try-catch

Validate before calling

if runtime.GOOS != "windows" {
	return errors.New("eventlog only available on Windows")
}
if _, err := eventlog.Open(winsvc.WINDOWS_SERVICE_NAME); err != nil {
	// register the source before creating the logger
	if cerr := eventlog.InstallAsEventCreate(winsvc.WINDOWS_SERVICE_NAME, eventlog.Error|eventlog.Warning|eventlog.Info); cerr != nil && !strings.Contains(cerr.Error(), "already exists") {
		return cerr
	}
}

Try / catch

w, err := winsvc.NewEventLogger(level)
if err != nil {
	if strings.Contains(err.Error(), "Failed to open Windows eventlog") {
		// fall back to file/stderr logging and register the source for next start
		return ioutil.Discard, nil // or a file logger
	}
	return nil, err
}

Prevention

When it happens

Trigger: Calling winsvc.NewEventLogger(level) on Windows when the event source has not been registered with the registry (no RegisterEventSource entry) or the process lacks permission to open it.

Common situations: Running the service binary without prior event-source registration (missing `eventlog.InstallAsEventCreate` step); running as a non-privileged user; accidentally invoking windows-only code on a non-Windows build where the API is unavailable anyway.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/d6288a76a9843e65. Report an issue: GitHub.