programing

명령 줄에서 log4j 수준을 어떻게 설정합니까?

nasanasas 2020. 12. 1. 08:07
반응형

명령 줄에서 log4j 수준을 어떻게 설정합니까?


작업중인 클래스에 몇 가지 log.debug 문을 추가하고 싶습니다. 테스트를 실행할 때 출력에서이를 확인하고 싶습니다. 다음과 같이 명령 줄에서 log4j 속성을 재정의하고 싶습니다.

-Dlog4j.logger.com.mypackage.Thingie=DEBUG

저는 이런 일을 자주합니다. 나는 명령 줄에서 이것을 전달하는 방법에만 관심이 있습니다. 구성 파일로 수행하는 방법을 알고 있으며 내 워크 플로에 적합하지 않습니다.


log4j는 이것을 직접 지원하지 않습니다.

구성 파일이 필요하지 않으므로 프로그래밍 구성을 사용하는 경우가 많습니다. 모든 시스템 속성을 검사하고이를 기반으로 원하는 것을 명시 적으로 프로그래밍하는 것이 좋습니다.


jvm 인수의 일부로 -Dlog4j.configuration=file:"<FILE_PATH>". 여기서 FILE_PATH는 log4j.properties 파일의 경로입니다.

제발 참고 기준으로 log4j2 , 사용에 새 시스템 변수가 log4j.configurationFile당신이 (즉없이 파일을 실제 경로에 넣어 file:접두사)와 자동 구성 파일의 확장명에 따라 공장을로드합니다 :

-Dlog4j.configurationFile=/path/to/log4jconfig.{ext}

이 답변은 실제로 가능한 가장 간단한 것을 시도하지 못하도록 설득했습니다! 다음 log4j.configuration과 같이 어 펜더 (예 : "콘솔")에 대한 임계 값을 지정하기 만하면됩니다 .

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

그런 다음 명령 줄에 시스템 속성을 포함합니다 -Dlog4j.info -Dmy.logging.threshold=INFO. 이 방법으로 다른 속성을 매개 변수화 할 수 있다고 가정하지만 이것이 전역 적으로 로깅 수준을 높이거나 낮추는 가장 쉬운 방법입니다.


Log4j2를 사용하면 코드에 추가 된 다음 유틸리티 메서드를 사용하여이를 수행 할 수 있습니다.

private static void setLogLevel() {
  if (Boolean.getBoolean("log4j.debug")) {
    Configurator.setLevel(System.getProperty("log4j.logger"), Level.DEBUG);
  }
}

이 수입품이 필요합니다

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;

이제 setLogLevelmain () 또는 적절한 곳에서 메서드를 호출하고 명령 줄 params -Dlog4j.logger=com.mypackage.Thingie-Dlog4j.debug=true.


Thorbjørn Ravn Andersens의 제안에 따라이 작업을 수행하는 코드를 작성했습니다.

main 메소드 초기에 다음을 추가하면 이제 comand 라인에서 로그 레벨을 설정할 수 있습니다. 이것은 내 프로젝트에서 테스트되었지만 log4j를 처음 사용했으며 실수를했을 수 있습니다. 그렇다면 저를 수정하십시오.

    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);
        }
    }

@lijat를 기반으로 한 간단한 구현이 있습니다. 내 스프링 기반 애플리케이션에서 나는 단순히 이것을 빈으로로드한다.

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);
    }
  }
}

내 예쁜 표준 설정에서 VM 옵션 (Java의 클래스 이전 명령 줄 또는 IDE의 VM 옵션)으로 전달 될 때 다음 작업이 잘 작동하는 것을 확인했습니다.

-Droot.log.level=TRACE

참고 URL : https://stackoverflow.com/questions/7126709/how-do-i-set-log4j-level-on-the-command-line

반응형