Skip to content

fix: make stdout/stderr log level follow -q/--quiet option (#12730) - #12733

Open
waterWang wants to merge 1 commit into
apache:masterfrom
waterWang:fix-12730-quiet-loglevel
Open

fix: make stdout/stderr log level follow -q/--quiet option (#12730)#12733
waterWang wants to merge 1 commit into
apache:masterfrom
waterWang:fix-12730-quiet-loglevel

Conversation

@waterWang

@waterWang waterWang commented Aug 11, 2026

Copy link
Copy Markdown

Summary

Fixes #12730mvn --quiet does not honor the -q/--quiet option.

Root cause

In LookupInvoker.doConfigureWithTerminalWithRawStreamsDisabled(), the stdout and stderr loggers were hardcoded to LocationAwareLogger.INFO_INT, ignoring the active log level set by the -q/--quiet option. When -q is passed, context.loggerLevel is set to ERROR, but the stdout logger remains at INFO, so [INFO] [stdout] ... lines still appear (e.g. from help:evaluate -DforceStdout).

Fix

Derive the stdout/stderr log level from context.loggerLevel instead of hardcoding INFO:

  • -q/--quiet → ERROR (suppresses [INFO] [stdout] prefix)
  • default → INFO (unchanged behavior)
  • -X/--debug → DEBUG

Impact

  • mvn --quiet help:evaluate -Dexpression=X -DforceStdout now prints just the value, without the [INFO] [stdout] prefix.
  • No behavior change for non-quiet invocations.

) [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT]
@waterWang waterWang changed the title fix: make stdout/stderr log level follow -q/--quiet option (#12730) [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] fix: make stdout/stderr log level follow -q/--quiet option (#12730) Aug 11, 2026

@gnodet gnodet left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The root cause analysis is correct — the [INFO] [stdout] prefix is unwanted in quiet mode. However, the fix has a critical logic error that makes it strictly worse than the current behavior:

stdout/stderr completely suppressed in quiet mode

Setting stdout.setLogLevel(ERROR_INT) raises the logger threshold to 40. But the logging calls are unchanged:

  • stdout.info("[stdout] " + s)INFO_INT (20) < ERROR_INT (40) → isLevelEnabled() returns false → entire message silently dropped
  • stderr.warn("[stderr] " + s)WARN_INT (30) < ERROR_INT (40) → same result

This means mvn --quiet help:evaluate -DforceStdout would produce zero output instead of the current [INFO] [stdout] <value>. The user's content (the actual evaluated value) is discarded along with the prefix.

The SLF4J level gate in MavenBaseLogger.isLevelEnabled() (line 251–254: return logLevel >= currentLogLevel) prevents any message below the logger's current level from being emitted.

Possible approaches

A correct fix would need to either:

  • Bypass the SLF4J level check for stdout/stderr passthrough (write directly to the terminal in quiet mode, similar to how doConfigureWithTerminalWithRawStreamsEnabled handles it)
  • Change the consumer lambda to use a raw write for content while suppressing only the decorative prefix
  • Use a dedicated output path that isn't level-gated

Missing tests

No tests were added to verify the new behavior. A test that checks stdout content passes through in quiet mode would have caught this issue.

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

Claude Code on behalf of gnodet

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

mvn does not honor -q nor --quiet

2 participants