SpringBoot 로그 단 계 를 어떻게 동적 으로 변경 합 니까?

머리말
로그 단계 에 대해 서 는 대부분의 항목 이 info 단계 로 설정 되 어 있 을 수 있 습 니 다.물론 성능 을 추구 하거나 민감 한 정 보 를 많이 포함 하 는 항목 이 있 을 수도 있 습 니 다.단 계 를 warn 또는 error 로 직접 설정 할 수도 있 습 니 다.이 때 항목 에 알 수 없 는 이상 이 발생 하면 상세 한 로그 정 보 를 사용 해 야 합 니 다.이 때 항목 에 로그 단 계 를 동적 으로 바 꾸 는 메커니즘 이 없 으 면 검색 문제 가 까다 로 울 것 입 니 다.
로그 시스템
우리 가 자주 사용 하 는 로그 시스템 은 Log4j 2,Logback,Java Util Logging 을 포함한다.로그 의 단 계 를 동적 으로 바 꾸 고 싶 습 니 다.전 제 는 로그 시스템 이 로그 등급 을 직접 설정 하 는 것 을 지원 합 니 다.물론 이 시스템 들 은 간단 한 인 터 페 이 스 를 제공 합 니 다.
  • Log4j2
  • 
    LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
    LoggerConfig loggerConfig = loggerContext.getConfiguration().getLoggers().get("root");
    loggerConfig.setLevel(level);
  • Logback
  • 
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    Logger logger = loggerContext.getLogger("root");
    ((ch.qos.logback.classic.Logger) logger).setLevel(level);
  • Java Util Logging
  • 
    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 도 모두 이런 시스템 을 지원 한다.이것 은 추상 적 인 유형 이 고 구체 적 인 실현 유형 이다.
  • JavaLoggingSystem
  • Log4J2LoggingSystem
  • LogbackLoggingSystem
  • NoOpLoggingSystem
  • 각각 몇 가지 로그 시스템 에 대응 합 니 다.이 몇 가지 내부 도 위 에서 소개 한 방법 으로 로그 단 계 를 바 꿉 니 다.물론 SpringBoot 는 현재 사용 하고 있 는 로그 시스템 을 자동 으로 식별 한 다음 에 어떤 LoggingSystem 을 사용 하 는 지 알 수 있 습 니 다.
    총결산
    대부분의 회사 들 은 로그 단 계 를 동적 으로 바 꾸 기 위해 설정 센터 를 사용 하 는 방식 이 더 많 습 니 다.이러한 방식 은 더욱 유연 합 니 다.또한 설정 센터 는 이미 많은 회사 의 레이 블 구성 요소 가 되 었 습 니 다.로그 단 계 를 바 꾸 는 것 뿐만 아니 라 변경 가능 한 모든 매개 변 수 를 사용 할 수 있 습 니 다.
    이상 은 SpringBoot 가 로그 단 계 를 어떻게 동적 으로 바 꾸 는 지 에 대한 상세 한 내용 입 니 다.SpringBoot 동적 으로 로그 단 계 를 바 꾸 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기