{"record":{"id":"7064e059f094dff0","repo":"github/github-mcp-server","slug":"failed-to-open-log-file-w-7064e0","errorCode":null,"errorMessage":"failed to open log file: %w","messagePattern":"failed to open log file: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/http/server.go","lineNumber":117,"sourceCode":"\tEnabledFeatures []string\n\n\t// InsidersMode expands to the curated set of feature flags enabled for insiders.\n\tInsidersMode bool\n}\n\nfunc RunHTTPServer(cfg ServerConfig) error {\n\t// Create app context\n\tctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)\n\tdefer stop()\n\n\tt, dumpTranslations := translations.TranslationHelper()\n\n\tvar slogHandler slog.Handler\n\tvar logOutput io.Writer\n\tif cfg.LogFilePath != \"\" {\n\t\tfile, err := os.OpenFile(cfg.LogFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to open log file: %w\", err)\n\t\t}\n\t\tlogOutput = file\n\t\tslogHandler = slog.NewTextHandler(logOutput, &slog.HandlerOptions{Level: slog.LevelDebug})\n\t} else {\n\t\tlogOutput = os.Stderr\n\t\tslogHandler = slog.NewTextHandler(logOutput, &slog.HandlerOptions{Level: slog.LevelInfo})\n\t}\n\tlogger := slog.New(slogHandler)\n\tlogger.Info(\"starting server\", \"version\", cfg.Version, \"host\", cfg.Host, \"lockdownEnabled\", cfg.LockdownMode, \"readOnly\", cfg.ReadOnly, \"insidersMode\", cfg.InsidersMode)\n\n\tapiHost, err := utils.NewAPIHost(cfg.Host)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to parse API host: %w\", err)\n\t}\n\thostType, err := utils.ParseHostType(cfg.Host)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to classify API host: %w\", err)\n\t}","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/github/github-mcp-server/blob/0ea1f775a7c73eff1bd2e25904d01136756bbfe2/pkg/http/server.go#L99-L135","documentation":"RunHTTPServer failed to open cfg.LogFilePath with os.OpenFile(O_CREATE|O_WRONLY|O_APPEND, 0600) - the OS refused to create or append the log file, so structured logging cannot start and startup aborts.","triggerScenarios":"Parent directory does not exist; permission denied for the server user; path points at a directory; read-only filesystem (container image); disk full or SELinux/AppArmor denial.","commonSituations":"Containers mounting volumes at different paths than configured; running as non-root against a root-owned log dir; distroless/read-only root filesystems; Kubernetes emptyDir not mounted where expected.","solutions":["Create the parent directory and give the server user write access (mkdir -p && chown)","Confirm the path is a file location, not a directory","On read-only filesystems, omit LogFilePath so logs go to stderr, or mount a writable volume at that path"],"exampleFix":"# before\nGITHUB_MCP_LOG_FILE=/var/log/mcp/server.log\n# after\nmkdir -p /var/log/mcp && chown appuser /var/log/mcp\nGITHUB_MCP_LOG_FILE=/var/log/mcp/server.log","handlingStrategy":"validation","validationCode":"if cfg.LogFilePath != \"\" {\n\tif dir := filepath.Dir(cfg.LogFilePath); dir != \"\" {\n\t\tif err := os.MkdirAll(dir, 0o750); err != nil {\n\t\t\treturn fmt.Errorf(\"log dir not creatable: %w\", err)\n\t\t}\n\t}\n\tf, err := os.OpenFile(cfg.LogFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)\n\tif err != nil { return err }\n\t_ = f.Close()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pre-create log directories in container images or init containers","Run the server as a user with write access to the log path","Prefer stderr logging on read-only filesystems"],"tags":["filesystem","configuration","logging"],"backgroundTag":null,"analyzedSha":"0ea1f775a7c73eff1bd2e25904d01136756bbfe2","analyzedAt":"2026-08-15T18:10:19.804Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}