SpringBoot 로그 단 계 를 어떻게 동적 으로 변경 합 니까?
8190 단어 SpringBoot동태로그 수준
로그 단계 에 대해 서 는 대부분의 항목 이 info 단계 로 설정 되 어 있 을 수 있 습 니 다.물론 성능 을 추구 하거나 민감 한 정 보 를 많이 포함 하 는 항목 이 있 을 수도 있 습 니 다.단 계 를 warn 또는 error 로 직접 설정 할 수도 있 습 니 다.이 때 항목 에 알 수 없 는 이상 이 발생 하면 상세 한 로그 정 보 를 사용 해 야 합 니 다.이 때 항목 에 로그 단 계 를 동적 으로 바 꾸 는 메커니즘 이 없 으 면 검색 문제 가 까다 로 울 것 입 니 다.
로그 시스템
우리 가 자주 사용 하 는 로그 시스템 은 Log4j 2,Logback,Java Util Logging 을 포함한다.로그 의 단 계 를 동적 으로 바 꾸 고 싶 습 니 다.전 제 는 로그 시스템 이 로그 등급 을 직접 설정 하 는 것 을 지원 합 니 다.물론 이 시스템 들 은 간단 한 인 터 페 이 스 를 제공 합 니 다.
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
LoggerConfig loggerConfig = loggerContext.getConfiguration().getLoggers().get("root");
loggerConfig.setLevel(level);
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = loggerContext.getLogger("root");
((ch.qos.logback.classic.Logger) logger).setLevel(level);
Logger logger = Logger.getLogger("root");
logger.setLevel(level);
물론 위 에서 로그 단 계 를 직접 설정 하 는 방식 을 제외 하고 설정 파일 을 동적 으로 불 러 올 수 있 는 방식 도 있 습 니 다.또한 설정 파일 에서 로그 단 계 를 동적 으로 변경 할 수 있 습 니 다.logback 을 예 로 들 면:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
File externalConfigFile = new File("logback.xml");
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
lc.reset();
configurator.doConfigure(externalConfigFileLocation);
위 에 서 는 모든 로그 시스템 이 로그 단 계 를 어떻게 설정 하 는 지 간단하게 소개 하 였 으 며,가장 중요 한 것 은 설정 이 끝 난 후에 실시 간 으로 효력 이 발생 하 는 것 입 니 다.바로 우리 가 원 하 는 로 그 를 볼 수 있 습 니 다.로그 단 계 를 어떤 방식 으로 바 꾸 느 냐 에 대한 문제 가 있 습 니 다.어떻게 동적 으로 단 계 를 바 꿉 니까?
어떻게 동적 으로 단 계 를 바 꾸 는 지 가장 간단 한 방법 은 대외 적 으로 인 터 페 이 스 를 제공 하고 로그 단 계 를 매개 변수 로 실시 간 으로 변경 하 는 것 입 니 다.또는 센터 를 설정 하 는 방식 으로;또한 SpringBoot 와 같은 주류 의 프레임 워 크 자체 도 동적 수정 기능 을 제공 했다.다음은 어떻게 실현 되 었 는 지 구체 적 으로 볼 수 있 습 니 다.logback 을 예 로 들 면;
사용자 정의 인터페이스
주어진 로그 단계 의 인 터 페 이 스 를 사용자 정의 합 니 다.외부 에 서 는 직접 호출 인 터 페 이 스 를 통 해 단 계 를 변경 합 니 다.
@RequestMapping(value = "logLevel/{logLevel}")
public String changeLogLevel(@PathVariable("logLevel") String logLevel) {
try {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger logger = loggerContext.getLogger("root");
((ch.qos.logback.classic.Logger) logger).setLevel(Level.valueOf(logLevel));
} catch (Exception e) {
logger.error("changeLogLevel error", e);
return "fail";
}
return "success";
}
로그 단 계 를 바 꾸 려 면 다음 주 소 를 직접 요청 하면 됩 니 다.debug 단 계 를 설정 하 십시오.http://[ip]:[port]/logLevel/debug
이런 방식 은 비교적 간단 하지만 노드 가 많 으 면 조작 하기 가 매우 번거롭다.물론 모든 노드 경 로 를 모 아서 한 번 에 모든 노드 의 요 구 를 촉발 할 수도 있다.사실 가장 좋 은 방법 은 구독 을 발표 하 는 방식 과 비슷 해 야 한다.게시 자 는 모든 구독 자 에 게 로그 단 계 를 바 꾸 는 통 지 를 보 내 고 새로운 노드 가 구독 자가 되면 된다.이런 방식 은 바로 현재 주류 의 설정 센터 방식 이다.
배치 센터
설정 센터 의 목적 은 자주 변동 하 는 매개 변 수 를 집중 적 으로 저장 하 는 것 입 니 다.특정한 시스템 이 시 작 될 때 설정 센터 에 가서 관련 매개 변 수 를 가 져 오 는 동시에 이 매개 변 수 를 감청 합 니 다.그 다음 에 설정 센터 에서 매개 변수의 값 을 바 꾸 면 실시 간 으로 관련 시스템 에 보 냅 니 다.이렇게 하면 시스템 이 다시 시작 하지 않 은 상태 에서 설정 을 업데이트 할 수 있 습 니 다.
기 존의 중간 부품 을 이용 하면 우 리 는 하나의 설정 센터 를 신속하게 실현 할 수 있다.예 를 들 어 Zookeeper 는 특정한 Node 를 감청 하 는 기능 을 제공 하고 MQ 와 Redis 는 구독 을 발표 하 는 기능 이 있 기 때문에 실시 간 으로 변경 을 푸 시 하 는 것 이 좋 을 것 이다.
Zookeeper 방식
PathChildren Cache 를 직접 사용 하여 하위 노드 를 감청 할 수 있 는 CHILDADDED,CHILD_UPDATED,CHILD_REMOVED 이벤트;이렇게 하면 Zookeeper 서버 에서 노드 의 값 을 업데이트 하면 클 라 이언 트 는 상기 세 가지 이 벤트 를 촉발 합 니 다.
private void watcherPath(String path) {
PathChildrenCache cache = new PathChildrenCache(client, path, true);
cache.start(StartMode.POST_INITIALIZED_EVENT);
cache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
switch (event.getType()) {
case CHILD_ADDED:
break;
case CHILD_UPDATED:
String logLevel = new String(event.getData().getData());
//
break;
case CHILD_REMOVED:
break;
default:
break;
}
}
});
}
MQ 방식MQ 는 보통 Queue 와 Topic 방식 이 있 습 니 다.Topic 방식 은 바로 구독 발표 모드 입 니 다.모든 클 러 스 터 노드 는 특정한 Topic 을 구독 할 수 있 습 니 다.그러면 게시 자 는 업데이트 로그 등급 의 메 시 지 를 보 내 고 다른 구독 노드 는 모두 받 을 수 있 습 니 다.
// Topic
private final String TOPIC = "LOGLEVEL";
private void watcherPaths() throws JMSException {
Topic topic = session.createTopic(TOPIC);
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
String logLevel = tm.getText();
//
}
});
}
Redis 방식Redis 는 캐 시 기능 을 제외 하고 MQ 와 같은 게시 구독 모드 도 제공 합 니 다.클 러 스 터 노드 는 채널 을 구독 하고 게시 자 는 이 채널 을 통 해 메 시 지 를 발표 합 니 다.
private void watcherPaths() throws JMSException {
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
String logLevel = message;
//
}
},"LOGLEVEL");
}
SpringBoot 내장SpringBoot 2.0 이후 actuator 를 통 해 로그 단 계 를 동적 으로 조정 할 수 있 습 니 다.주로 loggers 라 는 endpoint 를 노출 하여 이 루어 집 니 다.구체 적 인 절 차 는 다음 과 같 습 니 다.
actuator 를 도입 해 야 합 니 다
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
노출 로 거application.properties 에 다음 설정 을 추가 합 니 다:
management.endpoints.web.exposure.include=loggers
로그 레벨 보기시작 서 비 스 는 다음 을 통과 할 수 있 습 니 다:
http://[ip]:[port]/actuator/loggers
현재 항목 의 가방 마다 로그 단 계 를 봅 니 다:
{
levels: [
"OFF","ERROR","WARN","INFO","DEBUG","TRACE"
],
loggers: {
ROOT: {
configuredLevel: "INFO",
effectiveLevel: "INFO"
},
...
}
동적 수정 로그 단계POST 요청 보 내기:
http:/[ip]:[port]/actuator/loggers/[패키지 경로]
body 에서 configuredLevel 인 자 를 지정 해 야 합 니 다.
예 를 들 어 전체 항목 로그 단 계 를 error 로 변경 합 니 다.
http://[ip]:[port]/actuator/loggers/root
SpringBoot 내부 에서 로그 단 계 를 동적 으로 변경 하 는 방법 에 대해 서 는 핵심 클래스 Loggers Endpoint 를 볼 수 있 습 니 다.
@Endpoint(id = "loggers")
public class LoggersEndpoint {
private final LoggingSystem loggingSystem;
@WriteOperation
public void configureLogLevel(@Selector String name, @Nullable LogLevel configuredLevel) {
Assert.notNull(name, "Name must not be empty");
this.loggingSystem.setLogLevel(name, configuredLevel);
}
...
}
구체 적 으로 Logging System 을 통 해 로그 시스템 의 동태 적 인 단 계 를 바 꾸 었 고 그 위 에 주류 에서 사용 하 는 로그 시스템 도 소개 했다.SpringBoot 도 모두 이런 시스템 을 지원 한다.이것 은 추상 적 인 유형 이 고 구체 적 인 실현 유형 이다.총결산
대부분의 회사 들 은 로그 단 계 를 동적 으로 바 꾸 기 위해 설정 센터 를 사용 하 는 방식 이 더 많 습 니 다.이러한 방식 은 더욱 유연 합 니 다.또한 설정 센터 는 이미 많은 회사 의 레이 블 구성 요소 가 되 었 습 니 다.로그 단 계 를 바 꾸 는 것 뿐만 아니 라 변경 가능 한 모든 매개 변 수 를 사용 할 수 있 습 니 다.
이상 은 SpringBoot 가 로그 단 계 를 어떻게 동적 으로 바 꾸 는 지 에 대한 상세 한 내용 입 니 다.SpringBoot 동적 으로 로그 단 계 를 바 꾸 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.