How do I set log4j level on the command line?

后端 未结 7 903
暖寄归人
暖寄归人 2020-12-24 10:27

I want to add some log.debug statements to a class I\'m working on, and I\'d like to see that in output when running the test. I\'d like to override the log4j properties on

相关标签:
7条回答
  • 2020-12-24 10:36

    Based on Thorbjørn Ravn Andersens suggestion I wrote some code that makes this work

    Add the following early in the main method and it is now possible to set the log level from the comand line. This have been tested in a project of mine but I'm new to log4j and might have made some mistake. If so please correct me.

        Logger.getRootLogger().setLevel(Level.WARN);
        HashMap<String,Level> logLevels=new HashMap<String,Level>();
        logLevels.put("ALL",Level.ALL);
        logLevels.put("TRACE",Level.TRACE);
        logLevels.put("DEBUG",Level.DEBUG);
        logLevels.put("INFO",Level.INFO);
        logLevels.put("WARN",Level.WARN);
        logLevels.put("ERROR",Level.ERROR);
        logLevels.put("FATAL",Level.FATAL);
        logLevels.put("OFF",Level.OFF);
        for(String name:System.getProperties().stringPropertyNames()){
            String logger="log4j.logger.";
            if(name.startsWith(logger)){
                String loggerName=name.substring(logger.length());
                String loggerValue=System.getProperty(name);
                if(logLevels.containsKey(loggerValue))
                    Logger.getLogger(loggerName).setLevel(logLevels.get(loggerValue));
                else
                    Logger.getRootLogger().warn("unknown log4j logg level on comand line: "+loggerValue);
            }
        }
    
    0 讨论(0)
  • 2020-12-24 10:45

    As part of your jvm arguments you can set -Dlog4j.configuration=file:"<FILE_PATH>". Where FILE_PATH is the path of your log4j.properties file.

    Please note that as of log4j2, the new system variable to use is log4j.configurationFile and you put in the actual path to the file (i.e. without the file: prefix) and it will automatically load the factory based on the extension of the configuration file:

    -Dlog4j.configurationFile=/path/to/log4jconfig.{ext}
    
    0 讨论(0)
  • 2020-12-24 10:51

    In my pretty standard setup I've been seeing the following work well when passed in as VM Option (commandline before class in Java, or VM Option in an IDE):

    -Droot.log.level=TRACE
    
    0 讨论(0)
  • 2020-12-24 10:55

    These answers actually dissuaded me from trying the simplest possible thing! Simply specify a threshold for an appender (say, "console") in your log4j.configuration like so:

    log4j.appender.console.threshold=${my.logging.threshold}
    

    Then, on the command line, include the system property -Dlog4j.info -Dmy.logging.threshold=INFO. I assume that any other property can be parameterized in this way, but this is the easiest way to raise or lower the logging level globally.

    0 讨论(0)
  • 2020-12-24 11:00

    Based on @lijat, here is a simplified implementation. In my spring-based application I simply load this as a bean.

    public static void configureLog4jFromSystemProperties()
    {
      final String LOGGER_PREFIX = "log4j.logger.";
    
      for(String propertyName : System.getProperties().stringPropertyNames())
      {
        if (propertyName.startsWith(LOGGER_PREFIX)) {
          String loggerName = propertyName.substring(LOGGER_PREFIX.length());
          String levelName = System.getProperty(propertyName, "");
          Level level = Level.toLevel(levelName); // defaults to DEBUG
          if (!"".equals(levelName) && !levelName.toUpperCase().equals(level.toString())) {
            logger.error("Skipping unrecognized log4j log level " + levelName + ": -D" + propertyName + "=" + levelName);
            continue;
          }
          logger.info("Setting " + loggerName + " => " + level.toString());
          Logger.getLogger(loggerName).setLevel(level);
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-24 11:02

    log4j does not support this directly.

    As you do not want a configuration file, you most likely use programmatic configuration. I would suggest that you look into scanning all the system properties, and explicitly program what you want based on this.

    0 讨论(0)
提交回复
热议问题