{"record":{"id":"4537ff4300e8709b","repo":"microsoft/aspire","slug":"unsupported-log-level","errorCode":null,"errorMessage":"Unsupported log level.","messagePattern":"Unsupported log level\\.","errorType":"validation","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting/Ats/LoggingExports.cs","lineNumber":131,"sourceCode":"    [AspireExport]\n    public static void CompleteLogByName(this ResourceLoggerService loggerService, string resourceName)\n    {\n        loggerService.Complete(resourceName);\n    }\n\n    internal static LogLevel ParseLogLevel(string level, bool throwOnUnknown = false)\n    {\n        ArgumentNullException.ThrowIfNull(level);\n\n        return level.ToLowerInvariant() switch\n        {\n            \"trace\" => LogLevel.Trace,\n            \"debug\" => LogLevel.Debug,\n            \"information\" or \"info\" => LogLevel.Information,\n            \"warning\" or \"warn\" => LogLevel.Warning,\n            \"error\" => LogLevel.Error,\n            \"critical\" => LogLevel.Critical,\n            _ when throwOnUnknown => throw new ArgumentOutOfRangeException(nameof(level), level, \"Unsupported log level.\"),\n            _ => LogLevel.Information\n        };\n    }\n}\n","sourceCodeStart":113,"sourceCodeEnd":136,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting/Ats/LoggingExports.cs#L113-L136","documentation":"LoggingExports.ParseLogLevel maps a level string to Microsoft.Extensions.Logging.LogLevel and throws ArgumentOutOfRangeException when the string matches no known level name and throwOnUnknown is true. Supported names are trace, debug, information/info, warning/warn, error, and critical.","triggerScenarios":"Calling the Log ATS export with a level string like \"verbose\", \"fatal\", \"critical-fatal\", \"WARN \", or any typo, while throwOnUnknown is enabled (as done by PipelineExports.ParseLogLevel).","commonSituations":"Level names taken from user scripts or config written in another library's vocabulary (e.g., \"verbose\", \"fatal\" from other logging frameworks); trailing whitespace or wrong casing is handled by the parser's ToLowerInvariant but exotic synonyms are not.","solutions":["Use one of the supported level strings: trace, debug, information, info, warning, warn, error, critical.","Normalize nonstandard synonyms before calling (e.g., fatal -> critical, verbose -> debug).","Trim the string if it may contain whitespace, or pass throwOnUnknown: false to fall back to Information instead of throwing."],"exampleFix":"// before\nLog(\"verbose\", \"message\");\n// after\nLog(\"debug\", \"message\");","handlingStrategy":"validation","validationCode":"var allowed = new HashSet<string>(StringComparer.OrdinalIgnoreCase)\n    { \"trace\", \"debug\", \"information\", \"info\", \"warning\", \"warn\", \"error\", \"critical\" };\nif (!allowed.Contains(level))\n{\n    level = level switch { \"verbose\" => \"debug\", \"fatal\" => \"critical\", _ => \"information\" };\n}","typeGuard":"bool IsKnownLogLevel(string s) => s.Trim().ToLowerInvariant() is \"trace\" or \"debug\" or \"information\" or \"info\" or \"warning\" or \"warn\" or \"error\" or \"critical\";","tryCatchPattern":"try\n{\n    Log(level, message);\n}\ncatch (ArgumentOutOfRangeException ex) when (ex.ParamName == \"level\")\n{\n    Log(\"information\", message); // safe fallback\n}","preventionTips":["Keep a shared mapping from foreign level vocabularies (verbose/fatal) to Aspire's names.","Trim and lowercase level strings sourced from config or scripts before calling."],"tags":["logging","enum-parsing","argument-validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T09:17:21.228Z"}