log4j 로그 레벨을 동적으로 변경하여 응용 프로그램을 재배치 할 필요가없는 다른 접근법은 무엇입니까? 이 경우 변경 사항이 영구적입니까?
log4j 로그 레벨을 동적으로 변경하여 응용 프로그램을 재배치 할 필요가없는 다른 접근법은 무엇입니까? 이 경우 변경 사항이 영구적입니까?
답변:
로그 레벨 변경은 간단합니다. 구성의 다른 부분을 수정하면 더 깊이 접근 할 수 있습니다.
LogManager.getRootLogger().setLevel(Level.DEBUG);
변화는 생명주기를 통해 영구적입니다 Logger
입니다. 재 초기화시 구성을 읽고 런타임시 레벨을 설정하는 것으로 레벨 변경이 지속되지 않습니다.
업데이트 : Log4j 2를 사용하는 경우 구현 클래스를 통해 달성 할 수 있으므로 설명서setLevel
당 호출을 제거해야합니다 .
logger.setLevel () 또는 이와 유사한 메소드에 대한 호출은 API에서 지원되지 않습니다. 응용 프로그램은이를 제거해야합니다. 동등한 기능이 Log4j 2 구현 클래스에 제공되지만 응용 프로그램이 Log4j 2 내부의 변경에 영향을받을 수 있습니다.
LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
Log4j는 log4j.xml
파일의 구성 변경 을 감시 할 수 있습니다. log4j 파일을 변경하면 log4j는 변경 사항에 따라 자동으로 로그 수준을 새로 고칩니다. 의 설명서를 참조하십시오org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
하십시오. 확인 사이의 기본 대기 시간은 60 초입니다. 파일 시스템에서 구성 파일을 직접 변경하기 때문에 이러한 변경 사항은 영구적입니다. DOMConfigurator.configureAndWatch ()를 한 번만 호출하면됩니다.
주의 : configureAndWatch 메소드는 스레드 누출로 인해 J2EE 환경에서 사용하기에 안전하지 않습니다.
로그 레벨 (또는 일반적으로 재구성)을 설정하는 다른 방법은 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 로그 레벨을 변경하기 위해 이것을했고 그것은 나를 위해 일했다. 나는 어떤 문서도 언급하지 않았다. 이 시스템 특성 값을 사용하여 로그 파일 이름을 설정했습니다. 로깅 수준을 설정하기 위해 동일한 기술을 사용했으며 효과가있었습니다.
이것을 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 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.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));