복붙노트

[SPRING] 어떻게 봄 부팅 응용 프로그램을 다시 시작하지 않고 런타임에 로그 수준을 변경합니까

SPRING

어떻게 봄 부팅 응용 프로그램을 다시 시작하지 않고 런타임에 로그 수준을 변경합니까

PCF에 springboot 응용 프로그램을 배포했습니다. 환경 변수를 기반으로 메시지를 기록하고 싶습니다. 응용 프로그램을 다시 시작하지 않고 런타임 로그 수준 변경이 작동하도록하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.Spring 부트 1.5+에서 로그 레벨을 변경하는 것은 http-endpoint로 할 수 있습니다.

    Spring 부트 1.5+에서 로그 레벨을 변경하는 것은 http-endpoint로 할 수 있습니다.

    더하다

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    당신이 사용할 수있는 것보다

    curl -X "POST" "http://localhost:8080/loggers/de.springbootbuch" \
         -H "Content-Type: application/json; charset=utf-8" \
         -d $'{
      "configuredLevel": "WARN"
    }'  
    

    / loggers /를 넘는 모든 것은 로거의 이름입니다.

    PCF에서 이것을 실행하면 더 좋아집니다. 이것은 백엔드에서 직접 지원됩니다.

  2. ==============================

    2.Spring Boot 1.5.x 이후 로깅 엔드 포인트를 사용하여 원하는 로깅 레벨을 POST 할 수 있습니다.

    Spring Boot 1.5.x 이후 로깅 엔드 포인트를 사용하여 원하는 로깅 레벨을 POST 할 수 있습니다.

  3. ==============================

    3.로그백 API를 사용하여 프로젝트에서 로깅을 구성하는 경우 logback API의 자동 검색 기능을 사용할 수 있습니다. 설명서 별

    로그백 API를 사용하여 프로젝트에서 로깅을 구성하는 경우 logback API의 자동 검색 기능을 사용할 수 있습니다. 설명서 별

    <configuration scan="true"> 
      ... 
    </configuration> 
    

    자세한 내용은 logback API 문서를 참조하십시오.

  4. ==============================

    4.이것은 @Michael Simons 대답의 연장입니다. 이 방법을 사용하면 UI를 구현할 수 있습니다.

    이것은 @Michael Simons 대답의 연장입니다. 이 방법을 사용하면 UI를 구현할 수 있습니다.

    이 방법은 조금 길지만 훨씬 더 많은 것을 해결합니다. 우리는 Spring Boot Admin Server라는 도구를 사용할 것입니다.

    ... 너는 끝이야. 이제 런타임시 로거에 대한 디버그 수준을 변경할 수 있습니다.

    나는. Spring Boot Admin Server에 대한 url을 방문하십시오. 여기서는 여기 (http : / localhost : 8031)를 참조하십시오.

    ii. 등록 된 응용 프로그램 (클라이언트) 목록이 홈 페이지에 표시됩니다.

    iii. 등록 된 클라이언트에 대해 자세히를 클릭하면 다른 페이지로 이동합니다.

    iv. 응용 프로그램에 등록 된 모든 로거를 나열하는 로깅 탭을 클릭하십시오.

    v. 로그 수준을 변경하면 런타임에 로깅 수준이 변경됩니다. 기대하는 바를 알 수 있습니다.

  5. ==============================

    5.기본 로깅 공급자는 logback입니다. 런타임에 로깅 수준을 변경할 수 있도록 시스템을 설정하려면 다음 단계를 수행해야합니다.

    기본 로깅 공급자는 logback입니다. 런타임에 로깅 수준을 변경할 수 있도록 시스템을 설정하려면 다음 단계를 수행해야합니다.

    먼저 src / main / resources에서 spring의 기본 구성자를 포함하는 logback-spring.xml이라는 사용자 정의 로그백 구성을 만든 다음 JMX에 대한 로그백 구성을 표시하는 지시문을 추가합니다.

    <configuration>
      <include resource="org/springframework/boot/logging/logback/base.xml"/>
      <jmxConfigurator />    
    </configuration>
    

    이제 Jolokia JMX-over-HTTP 브리지 (org.jolokia : jolokia-core)에 종속성을 추가하십시오.

    이제 스프링 부트 응용 프로그램에서 / jolokia 끝점에 도달 할 수 있어야합니다. 프로토콜은 여기에 설명되어 있습니다. 꽤 아니야. 시작하려면 다음과 같이 브라우저에서 직접 실행할 수있는 몇 가지 예를 들어 보겠습니다.

    ROOT 로거 레벨 표시 :

    /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/getLoggerLevel/ROOT
    

    ROOT 로거 수준을 debug로 변경하십시오.

    /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/setLoggerLevel/ROOT/debug
    

    스프링 부트 액추에이터는 / jolokia 엔드 포인트를 인식하고 있으므로 민감한 것으로 표시되어 있으므로 classpath에 스프링 보안이 있으면 인증이 필요합니다.

  6. ==============================

    6.로깅에 Log4j 2를 사용하는 경우 환경 변수 또는 시스템 특성에 따라 사용할 로그 레벨을 쉽게 구성 할 수 있습니다. 이 방법을 사용하면 환경이 변경 되었기 때문에 파일을 수정할 필요가 없습니다.

    로깅에 Log4j 2를 사용하는 경우 환경 변수 또는 시스템 특성에 따라 사용할 로그 레벨을 쉽게 구성 할 수 있습니다. 이 방법을 사용하면 환경이 변경 되었기 때문에 파일을 수정할 필요가 없습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="ERROR" monitorInterval="300">
    <properties>
      <property name="LOG_DIR">${sys:user.dir}/logs/</property>
      <property name="log_env">${sys:env:-lab}</property>
      <property name="flow_lab">${sys:flow_match:-ACCEPT}</property>
      <property name="flow_prod">NEUTRAL</property>
      <property name="level_lab">DEBUG</property>
      <property name="level_prod">INFO</property>
    </properties>
    <MarkerFilter marker="FLOW" onMatch="${flow_${log_env}}" onMismatch="NEUTRAL"/>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{ABSOLUTE} %-5level # %class.%method %m%n" />
        </Console>
    
        <RollingFile name="log4j" fileName="${LOG_DIR}/log4j.txt" filePattern="${LOG_DIR}/archive/log4j.txt.%d{yyyyMMdd_HHmmss}-%i">
            <PatternLayout>
                <MarkerPatternSelector defaultPattern="%d [%t] %-5p %X{requestId, sessionId, loginId, userId, ipAddress, corpAcctNumber} %C{1.}.%M:%L - %m%n">
                    <PatternMatch key="FLOW" pattern="%d [%t] %-5p %X{requestId, sessionId, loginId, userId, ipAddress, corpAcctNumber} -------- %C{1.}.%M:%L %msg --------%n"/>
                </MarkerPatternSelector>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="30 MB"/>
            </Policies>
            <!-- A max of 20 will allow 20 files per second with the date pattern specified on the RollingFile declaration.
                 Hopefully that is a ridiculous value -->
            <DefaultRolloverStrategy min="1" max="20">
                <Delete basePath="${LOG_DIR}/archive">
                    <!-- Nested conditions: the inner condition is only evaluated on files for which the outer conditions are true. -->
                    <IfFileName glob="log4j.txt.*">
                        <!-- Only allow 1 GB of files to accumulate -->
                        <IfAccumulatedFileSize exceeds="1 GB"/>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.mycorp.package1" level="${level_${log_env}}" additivity="false">
            <AppenderRef ref="log4j"/>
        </Logger>
        <Logger name="com.mycorp.package2" level="info" additivity="false">
            <AppenderRef ref="log4j"/>
        </Logger>
        <Root level="${level_${log_env}}">
            <AppenderRef ref="log4j" />
        </Root>
    </Loggers>
    

  7. ==============================

    7.웹 서비스에 설정 페이지를 추가하여 로그 수준을 업데이트 할 수도 있습니다. 이것은 ajax를 사용하여 수행 할 수 있습니다. 다음 예제는 login 및 csrf 토큰을 포함합니다.

    웹 서비스에 설정 페이지를 추가하여 로그 수준을 업데이트 할 수도 있습니다. 이것은 ajax를 사용하여 수행 할 수 있습니다. 다음 예제는 login 및 csrf 토큰을 포함합니다.

    먼저 새 로그 수준을 지정하는 양식을 추가하십시오. 예를 들어 select 요소를 사용하여 향상시킬 수 있습니다.

    <form>
        <input type="text" id="logClassName" name="logClassName"/>
        <input type="text" id="logLevel" name="logLevel" />
        <button onclick="submitLogLevelChange(); return false;">Submit</button>
    </form>
    

    그런 다음 요청이 전송됩니다.

    function submitLogLevelChange() {
        var className = document.getElementById('logClassName').value;
        var logLevel = document.getElementById("logLevel").value;
        $.ajax({
            // Set up security, see below.
            beforeSend: setHeader,
            type: 'POST',
            // specify the logger to be modified
            url: "/loggers/" + className,
            // specify the new log level
            data: '{"configuredLevel":"' + logLevel + '"}',
            contentType: 'application/json',
            processData: false,
            }).done(function(data, textStatus, jqXHR) {
                if (jqXHR.status === 200) {
                    // Happy
                } else if (jqXHR.status === 401) {
                    // Logged out or not enough user rights
                } else {
                    //Some other problem
                }
            })
            .fail(function(jqXHR, textStatus ) {
                if (jqXHR.status === 200) {
                    // Actually was successful, FireFox has some issues...
                } else {
                    // Failure
                }
            });
        }
    

    다음 함수는 csrf 토큰을 POST 요청에 주입합니다.

    function setHeader(xhr) {
      var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
      xhr.setRequestHeader(header, token);
    }
    
  8. from https://stackoverflow.com/questions/33844580/how-do-i-change-log-level-in-runtime-without-restarting-spring-boot-application by cc-by-sa and MIT license