From 06b23410bd4421fc73c1911eb4ccb436546a3bf6 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 19 Oct 2021 13:07:26 +0200 Subject: [PATCH] Expose logging levels configuration This is just an example how to expose logger levels (by logger name) to configure their levels. --- .../java/org/apache/maven/cli/CLIManager.java | 5 ++++- .../java/org/apache/maven/cli/MavenCli.java | 13 ++++++++++++ .../cli/logging/BaseSlf4jConfiguration.java | 8 ++++++++ .../maven/cli/logging/Slf4jConfiguration.java | 8 ++++++++ .../cli/logging/impl/Log4j2Configuration.java | 8 +++++++- .../logging/impl/LogbackConfiguration.java | 12 ++++++++++- .../impl/Slf4jSimpleConfiguration.java | 20 ++++++++++++++++++- 7 files changed, 70 insertions(+), 4 deletions(-) diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java index e15af81aa87b..89c6783c1ab8 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java @@ -110,6 +110,8 @@ public class CLIManager public static final String COLOR = "color"; + public static final String VERBOSE_LOGGERS = "XL"; + /** This option is deprecated and may be repurposed as Java debug in a future version. * Use {@code -X/--verbose} instead. */ @Deprecated @@ -127,7 +129,7 @@ public CLIManager() options.addOption( Option.builder( Character.toString( OFFLINE ) ).longOpt( "offline" ).desc( "Work offline" ).build() ); options.addOption( Option.builder( Character.toString( VERSION ) ).longOpt( "version" ).desc( "Display version information" ).build() ); options.addOption( Option.builder( Character.toString( QUIET ) ).longOpt( "quiet" ).desc( "Quiet output - only show errors" ).build() ); - options.addOption( Option.builder( Character.toString( VERBOSE ) ).longOpt( "verbose" ).longOpt( "verbose" ).desc( "Produce execution verbose output" ).build() ); + options.addOption( Option.builder( Character.toString( VERBOSE ) ).longOpt( "verbose" ).desc( "Produce execution verbose output" ).build() ); options.addOption( Option.builder( Character.toString( ERRORS ) ).longOpt( "errors" ).desc( "Produce execution error messages" ).build() ); options.addOption( Option.builder( Character.toString( NON_RECURSIVE ) ).longOpt( "non-recursive" ).desc( "Do not recurse into sub-projects. When used together with -pl, do not recurse into sub-projects of selected aggregators" ).build() ); options.addOption( Option.builder( Character.toString( UPDATE_SNAPSHOTS ) ).longOpt( "update-snapshots" ).desc( "Forces a check for missing releases and updated snapshots on remote repositories" ).build() ); @@ -158,6 +160,7 @@ public CLIManager() options.addOption( Option.builder( BUILDER ).longOpt( "builder" ).hasArg().desc( "The id of the build strategy to use" ).build() ); options.addOption( Option.builder( NO_TRANSFER_PROGRESS ).longOpt( "no-transfer-progress" ).desc( "Do not display transfer progress when downloading or uploading" ).build() ); options.addOption( Option.builder().longOpt( COLOR ).hasArg().optionalArg( true ).desc( "Defines the color mode of the output. Supported are 'auto', 'always', 'never'." ).build() ); + options.addOption( Option.builder( VERBOSE_LOGGERS ).longOpt( "verboseLoggers" ).hasArg().desc( "Produce verbose output for loggers (comma separated list of logger names)" ).build() ); // Deprecated options.addOption( Option.builder().longOpt( DEBUG ).desc( "Produce execution verbose output (deprecated; only kept for backward compatibility)" ).build() ); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index ead13313071f..44779fa4e73b 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -511,6 +511,19 @@ void logging( CliRequest cliRequest ) slf4jLoggerFactory = LoggerFactory.getILoggerFactory(); Slf4jConfiguration slf4jConfiguration = Slf4jConfigurationFactory.getConfiguration( slf4jLoggerFactory ); + String[] verboseLoggers = null; + if ( cliRequest.commandLine.hasOption( CLIManager.VERBOSE_LOGGERS ) ) + { + verboseLoggers = cliRequest.commandLine.getOptionValues( CLIManager.VERBOSE_LOGGERS ); + } + if ( verboseLoggers != null ) + { + for ( String verboseLogger : verboseLoggers ) + { + slf4jConfiguration.setLoggerLevel( verboseLogger, Slf4jConfiguration.Level.DEBUG ); + } + } + if ( cliRequest.verbose ) { cliRequest.request.setLoggingLevel( MavenExecutionRequest.LOGGING_LEVEL_DEBUG ); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/logging/BaseSlf4jConfiguration.java b/maven-embedder/src/main/java/org/apache/maven/cli/logging/BaseSlf4jConfiguration.java index 33c47c2210a6..2782289ce0a2 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/logging/BaseSlf4jConfiguration.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/logging/BaseSlf4jConfiguration.java @@ -33,11 +33,19 @@ public class BaseSlf4jConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger( BaseSlf4jConfiguration.class ); + @Override public void setRootLoggerLevel( Level level ) { LOGGER.warn( "setRootLoggerLevel: operation not supported" ); } + @Override + public void setLoggerLevel( final String loggerName, final Level level ) + { + LOGGER.warn( "setLoggerLevel: operation not supported" ); + } + + @Override public void activate() { LOGGER.warn( "reset(): operation not supported" ); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jConfiguration.java b/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jConfiguration.java index 8dc81c708651..8922cb9d509f 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jConfiguration.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jConfiguration.java @@ -43,6 +43,14 @@ enum Level */ void setRootLoggerLevel( Level level ); + /** + * Set logging level for given logger name. + + * @param loggerName the logger name. + * @param level the level. + */ + void setLoggerLevel( String loggerName, Level level ); + /** * Activate logging implementation configuration (if necessary). */ diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Log4j2Configuration.java b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Log4j2Configuration.java index b24ea9cf35b5..05a7f07194f2 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Log4j2Configuration.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Log4j2Configuration.java @@ -32,6 +32,12 @@ public class Log4j2Configuration { @Override public void setRootLoggerLevel( Level level ) + { + setLoggerLevel( "root", level ); + } + + @Override + public void setLoggerLevel( final String loggerName, final Level level ) { String value; switch ( level ) @@ -48,7 +54,7 @@ public void setRootLoggerLevel( Level level ) value = "error"; break; } - System.setProperty( "maven.logging.root.level", value ); + System.setProperty( "maven.logging." + loggerName + ".level", value ); } @Override diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/LogbackConfiguration.java b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/LogbackConfiguration.java index 5d9fab74425a..b1a918a90fda 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/LogbackConfiguration.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/LogbackConfiguration.java @@ -23,6 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static java.util.Objects.requireNonNull; + /** * Configuration for slf4j-logback. * @@ -35,6 +37,14 @@ public class LogbackConfiguration @Override public void setRootLoggerLevel( Level level ) { + setLoggerLevel( Logger.ROOT_LOGGER_NAME, level ); + } + + @Override + public void setLoggerLevel( final String loggerName, final Level level ) + { + requireNonNull( loggerName ); + requireNonNull( level ); ch.qos.logback.classic.Level value; switch ( level ) { @@ -50,7 +60,7 @@ public void setRootLoggerLevel( Level level ) value = ch.qos.logback.classic.Level.ERROR; break; } - ( (ch.qos.logback.classic.Logger) LoggerFactory.getLogger( Logger.ROOT_LOGGER_NAME ) ).setLevel( value ); + ( ( ch.qos.logback.classic.Logger ) LoggerFactory.getLogger( loggerName ) ).setLevel( value ); } @Override diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java index 3961059dbec3..4996b8a7b485 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java @@ -23,6 +23,8 @@ import org.slf4j.MavenSlf4jFriend; import org.slf4j.impl.MavenSlf4jSimpleFriend; +import static java.util.Objects.requireNonNull; + /** * Configuration for slf4j-simple. * @@ -35,6 +37,22 @@ public class Slf4jSimpleConfiguration @Override public void setRootLoggerLevel( Level level ) { + requireNonNull( level ); + setSlf4jSimpleLoggerLevel( "defaultLogLevel", level ); + } + + @Override + public void setLoggerLevel( final String loggerName, final Level level ) + { + requireNonNull( loggerName ); + requireNonNull( level ); + setSlf4jSimpleLoggerLevel( "log." + loggerName, level ); + } + + private void setSlf4jSimpleLoggerLevel( final String loggerName, final Level level ) + { + requireNonNull( loggerName ); + requireNonNull( level ); String value; switch ( level ) { @@ -50,7 +68,7 @@ public void setRootLoggerLevel( Level level ) value = "error"; break; } - System.setProperty( "org.slf4j.simpleLogger.defaultLogLevel", value ); + System.setProperty( "org.slf4j.simpleLogger." + loggerName, value ); } @Override