동적으로 log4j 로그 레벨 변경
log4j 로그 레벨을 동적으로 변경하는 다른 방법은 무엇입니까? 그래서 응용 프로그램을 재배치 할 필요가 없습니다. 이 경우 변경 사항이되는 경우?
로그 레벨 변경은 간단합니다. 구성의 다른 부분을 수정하면 더 깊이 접근 할 수 있습니다.
LogManager.getRootLogger().setLevel(Level.DEBUG);
변경 사항은 수명주기를 연장 할 수 Logger
있습니다. 재 초기화시 구성을 실행시 레벨을 설정하는 레벨 변경이 지속되지 않습니다.
업데이트 : Log4j 2를 사용하는 경우 구현 클래스를 통해 달성 할 수 있으므로 설명서setLevel
당 호출을 제거해야합니다 .
logger.setLevel () 또는 이와 유사한 메소드에 대한 호출은 API에서 지원되지 않습니다. 응용 프로그램은 제거해야합니다. 동일한 기능이 Log4j 2 구현 클래스에 제공되는 응용 프로그램이 Log4j 2 내부의 변경에 영향을받을 수 있습니다.
파일 감시
Log4j는 log4j.xml
파일의 구성 변경 을 감시 할 수 있습니다. log4j는 변경 사항에 따라 자동으로 로그 수준을 새로 고칩니다. 자세한 내용은의 설명서를 참조 org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
하십시오. 확인 사이의 기본 대기 시간은 60 초입니다. 파일 시스템에서 구성 파일을 직접 변경하기 때문에 변경 사항은 전부입니다. DOMConfigurator.configureAndWatch ()를 한 번만 호출하면됩니다.
주의 : configureAndWatch 메소드는 문법은 문법으로 인해 J2EE 환경에서 사용 안전하지 않습니다.
JMX
로그 레벨 (또는 내부적으로)을 설정하는 방법은 JMX를 사용하는 것입니다. Log4j는 로거를 JMX MBean으로 등록합니다. 애플리케이션 서버 MBeanServer 콘솔 (또는 JDK의 jconsole.exe)을 사용하여 각 구성 로거를 사용할 수 있습니다. 구성 변경 사항은 파일이지 응용 프로그램 (서버)을 다시 구성 후 구성됩니다.
스스로 만든
Aaron이 접근 방식으로 접근 할 수 있습니다. 원하는 방식으로 응용 프로그램에서 구현할 수 있습니다. 예를 들어, 사용자 또는 관리자가 로그 레벨을 변경 setLevel()
하고 로거 에서 메소드 를 호출하는 GUI가있을 수 있습니다 . 당신이 설정을 어딘가에 있는지 여부는 당신에게 달려 있습니다.
지정된 간격으로 log4j 2 .xml 파일 (또는 동등한 파일) 을 스캔하여 구성을 새로 고치도록 Log4j2를 구성 할 수 있습니다 . " monitorInterval "매개 변수를 구성 태그에 추가하십시오 . 마지막 log 이벤트 이후 5 초 이상 지난 경우 log4j가 구성을 다시 스캔하도록 지시 하는 샘플 log4j 2 .xml 파일의 2 행을 참조하십시오 .
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" monitorInterval="5" name="tryItApp" packages="">
<Appenders>
<RollingFile name="MY_TRY_IT"
fileName="/var/log/tryIt.log"
filePattern="/var/log/tryIt-%i.log.gz">
<Policies>
<SizeBasedTriggeringPolicy size="25 MB"/>
</Policies>
...
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MY_TRY_IT"/>
</Root>
</Loggers>
</Configuration>
Tomcat 인스턴스, IDE 내부 또는 스프링 부트를 사용하는 경우 작업을 수행하기위한 추가 단계가 있습니다. 다소 범위를 벗어난 것으로 보이며 아마도 별도의 질문이있을 것입니다.
log4j 1.x에서는 DOMConfigurator를 사용하여 사전 정의 된 XML 로그 구성 세트 중 하나 (예 : 일반적인 용도 및 수요 용)을 사용하는 것이 가장 좋습니다.
이것들을 사용하는 것은 다음과 같이 할 수 있습니다.
public static void reconfigurePredefined(String newLoggerConfigName) {
String name = newLoggerConfigName.toLowerCase();
if ("default".equals(name)) {
name = "log4j.xml";
} else {
name = "log4j-" + name + ".xml";
}
if (Log4jReconfigurator.class.getResource("/" + name) != null) {
String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath();
logger.warn("Using log4j configuration: " + logConfigPath);
try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) {
new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository());
} catch (IOException e) {
logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e);
} catch (FactoryConfigurationError e) {
logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e);
}
} else {
logger.error("Could not find log4j configuration file " + name + ".xml on classpath");
}
}
적절한 구성 이름으로 이것을 호출하고 템플릿을 클래스 경로에 배치했는지 확인하십시오.
이 답변은 로깅 수준을 동적으로 변경하는 데 도움이되지 않습니다. 서비스를 다시 시작해야합니다. 서비스를 제대로 다시 시작하는 경우 아래 솔루션을 사용하십시오.
나는 이것을 변경 log4j 로그 수준으로했고 그것은 나를 위해 일했으며 어떤 문서도 참조하지 않았습니다. 이 시스템 속성 값을 사용하여 로그 파일 이름을 설정했습니다. 동일한 기술을 사용하여 로깅 수준도 설정했으며 작동했습니다.
이것을 JVM 매개 변수로 전달했습니다 (Java 1.7 사용).
로깅 수준이 동적으로 변경되지는 않습니다. 서비스를 다시 시작해야합니다.
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
log4j.properties 파일에이 항목을 추가했습니다.
log4j.rootLogger=${logging.level},file,stdout
나는 시도했다
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
java -Dlogging.level=INFO-cp xxxxxx.jar xxxxx.java
java -Dlogging.level=OFF -cp xxxxxx.jar xxxxx.java
모두 효과가있었습니다. 도움이 되었기를 바랍니다!
내 pom.xml에 다음과 같은 종속성이 있습니다.
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>
모든 로거의 로깅 수준을 변경하려면 아래 방법을 사용하십시오. 이것은 모든 로거를 열거하고 로깅 수준을 주어진 수준으로 변경합니다. 당신이 있는지 확인하십시오 하지 마십시오 가 log4j.appender.loggerName.Threshold=DEBUG
당신의 속성이 설정 log4j.properties
파일.
public static void changeLogLevel(Level level) {
Enumeration<?> loggers = LogManager.getCurrentLoggers();
while(loggers.hasMoreElements()) {
Logger logger = (Logger) loggers.nextElement();
logger.setLevel(level);
}
}
다음 코드 스 니펫을 사용할 수 있습니다.
((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));
참고 URL : https://stackoverflow.com/questions/4598702/dynamically-changing-log4j-log-level
'IT' 카테고리의 다른 글
이 bash 포크 폭탄은 어떻게 작동 작동? (0) | 2020.07.19 |
---|---|
VB는 대소 문자를 구분하지 않습니다. (0) | 2020.07.19 |
기본 습관을 확장하는 것이 왜 나쁜 습관입니까? (0) | 2020.07.19 |
nginx에서 업스트림이란 무엇입니까? (0) | 2020.07.19 |
증강 현실 프레임 워크 (0) | 2020.07.19 |