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
- Register the event source once at install time (eventlog.InstallAsEventCreate with WINDOWS_SERVICE_NAME)
- Run the service under an account with permission to open the event log
- 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
- Register the event source during installation (eventlog.InstallAsEventCreate)
- Run the service under an account with event-log access rights
- Keep windows-only code behind build tags so it never runs on other platforms
- Implement a file/stdout logging fallback when the eventlog is unavailable
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
- eventlog.level must be one of INFO, WARN, or ERROR
- EventLogger is not supported on this platform
- could not configure eventlog - %w
- could not start service - %w
- could not remove eventlog configuration - %w
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/d6288a76a9843e65.
Report an issue: GitHub.