{"record":{"id":"910c8182d251caa4","repo":"quarkusio/quarkus","slug":"the-level-of-the-root-logger-cannot-be-set-to-null","errorCode":null,"errorMessage":"The level of the root logger cannot be set to null","messagePattern":"The level of the root logger cannot be set to null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/devui/runtime/src/main/java/io/quarkus/devui/runtime/logstream/LogStreamJsonRPCService.java","lineNumber":98,"sourceCode":"                    \"effectiveLevel\", getEffectiveLogLevel(logger),\n                    \"configuredLevel\", getConfiguredLogLevel(logger));\n        }\n        return null;\n    }\n\n    @NonBlocking\n    @JsonRpcDescription(\"Update a specific logger's log level in this Quarkus application\")\n    @DevMCPEnableByDefault\n    public JsonObject updateLogLevel(@JsonRpcDescription(\"The name of the logger\") String loggerName,\n            @JsonRpcDescription(\"The new level of the logger\") String levelValue) {\n        LogContext logContext = LogContext.getLogContext();\n        Logger logger = logContext.getLogger(loggerName);\n        java.util.logging.Level level;\n        if (levelValue == null || levelValue.isBlank()) {\n            if (logger.getParent() != null) {\n                level = logger.getParent().getLevel();\n            } else {\n                throw new IllegalArgumentException(\"The level of the root logger cannot be set to null\");\n            }\n        } else {\n            level = Level.parse(levelValue);\n        }\n        logger.setLevel(level);\n        LOG.info(\"Log level updated [\" + loggerName + \"] changed to [\" + levelValue + \"]\");\n\n        return getLogger(loggerName);\n    }\n\n    private static String toLogLine(JsonObject json) {\n        return String.format(\n                \"%s %s [%s] (%s) %s\",\n                json.getString(\"timestamp\"),\n                json.getString(\"level\"),\n                json.getString(\"loggerName\"),\n                json.getString(\"threadName\"),\n                json.getString(\"formattedMessage\"));","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devui/runtime/src/main/java/io/quarkus/devui/runtime/logstream/LogStreamJsonRPCService.java#L80-L116","documentation":"LogStreamJsonRPCService.updateLogLevel() sets a java.util.logging level for a named logger. If levelValue is null/blank, it inherits the parent logger's level; but when the target logger has no parent (i.e. it is the root logger), there is nothing to inherit, so it throws IllegalArgumentException that the root logger level cannot be set to null.","triggerScenarios":"Invoking the Dev UI log-stream JSON-RPC updateLogLevel with an empty or null level for the root logger (loggerName empty or \"\" resolving to a parentless logger).","commonSituations":"Front-end sending an empty level string when the user clears the level input for the ROOT logger; also triggered by Level.parse failing separately for garbage values.","solutions":["Send a valid level name (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL, OFF)","Only send null/blank level for non-root loggers to mean 'inherit parent'","Guard in the Dev UI form to require a level when the target is the root logger"],"exampleFix":"// before\nupdateLogLevel(\"\", \"\"); // root logger, blank level\n// after\nupdateLogLevel(\"\", \"INFO\"); // or pick a non-root logger for inheritance","handlingStrategy":"validation","validationCode":"const LEVELS = ['SEVERE','WARNING','INFO','CONFIG','FINE','FINER','FINEST','ALL','OFF'];\nif ((levelValue == null || levelValue === '') && isRootLogger(loggerName)) levelValue = 'INFO';","typeGuard":"const isKnownLevel = v => typeof v === 'string' && LEVELS.includes(v.toUpperCase());","tryCatchPattern":"try { rpc.call('logstream/updateLogLevel', { loggerName, levelValue }); }\ncatch (e) { if (String(e.message).includes('root logger')) { /* send an explicit level instead */ } else { throw e; } }","preventionTips":["Only send blank level for non-root loggers","Constrain the Dev UI level selector to known JUL levels","Default the root logger to INFO when clearing the input"],"tags":["devui","logging","json-rpc","jul"],"backgroundTag":"invalid-log-level","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}