hashicorp/nomad · error

Failed to open Windows eventlog

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.

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.

Appendix: 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)