You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2021/10/19 11:08:14 UTC

[maven] 01/01: Expose logging levels configuration

This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch logger-levels-config
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 06b23410bd4421fc73c1911eb4ccb436546a3bf6
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue Oct 19 13:07:26 2021 +0200

    Expose logging levels configuration
    
    This is just an example how to expose logger levels (by logger name)
    to configure their levels.
---
 .../main/java/org/apache/maven/cli/CLIManager.java   |  5 ++++-
 .../src/main/java/org/apache/maven/cli/MavenCli.java | 13 +++++++++++++
 .../maven/cli/logging/BaseSlf4jConfiguration.java    |  8 ++++++++
 .../apache/maven/cli/logging/Slf4jConfiguration.java |  8 ++++++++
 .../maven/cli/logging/impl/Log4j2Configuration.java  |  8 +++++++-
 .../maven/cli/logging/impl/LogbackConfiguration.java | 12 +++++++++++-
 .../cli/logging/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 e15af81..89c6783 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 class 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 class 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 ead1331..44779fa 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 @@ public class MavenCli
         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 33c47c2..2782289 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 8dc81c7..8922cb9 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
@@ -44,6 +44,14 @@ public interface Slf4jConfiguration
     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).
      */
     void activate();
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 b24ea9c..05a7f07 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
@@ -33,6 +33,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 class Log4j2Configuration
                 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 5d9fab7..b1a918a 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.apache.maven.cli.logging.BaseSlf4jConfiguration;
 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 class LogbackConfiguration
                 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 3961059..4996b8a 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.apache.maven.cli.logging.BaseSlf4jConfiguration;
 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 class Slf4jSimpleConfiguration
                 value = "error";
                 break;
         }
-        System.setProperty( "org.slf4j.simpleLogger.defaultLogLevel", value );
+        System.setProperty( "org.slf4j.simpleLogger." + loggerName, value );
     }
 
     @Override