환경 변수를 통한 스프링 부팅 로깅 수준 설정
Spring Boot 어플리케이션에서 환경변수만으로 로깅레벨을 설정할 수 있을까요?
않다application.propertiesCloud Foundry에서 실행 중이며 배포 없이 변경 사항을 선택하고 싶기 때문입니다(단, 앱이 다시 시작된 후 또는 보다 정확하게 다시 작성된 후).
vars를 env vars처럼 LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE효과가 없어요.「 」를 .logging.level.org.springframework: TRACEapplication.properties하지만 효과가 있습니다.
이건 그냥 아이디어인데 설정해 봤어요?
_JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACE
됩니다.-Dlogging.level.org.springframework=TRACE는 기본 JVM 인수로 전달되며 사용자 환경의 모든 JVM 인스턴스에 영향을 미칩니다.
환경변수를 통한 로그레벨 설정은 패키지에 대해서만 실행할 수 있으며 클래스에 대해서는 할 수 없습니다.
OP를 사용하다그리고 왜 여기 있는 사용자 중 일부는 제안된 솔루션이 잘 작동한다고 보고한 반면 다른 사용자는 그렇지 않다고 답했는지 궁금했습니다.
Spring Boot 2.1을 사용하고 있으며, 최근 몇 년간 문제가 약간 바뀌었습니다만, 현재 상황은 다음과 같습니다.
TL;DR
패키지의 로그 레벨 설정은 다음과 같이 동작합니다.
LOGGING_LEVEL_COM_ACME_PACKAGE=DEBUG
특정 클래스의 로그 수준을 설정해도 효과가 없습니다.
LOGGING_LEVEL_COM_ACME_PACKAGE_CLASS=DEBUG
어떻게 그럴 수가?
Spring Boot의 Logging Application Listener를 참조하십시오.
의 로그레벨 com.acme.mypackage.MyClass becomes가 되다com.acme.mypackage.myclass.
따라서 클래스의 로그 수준 정의는 패키지의 로그 수준 정의와 동일합니다.
이는 환경변수에 대한 대문자 표기법을 제안하는 스프링의 완화 바인딩과 관련이 있습니다.따라서 Logging Application Listener에는 클래스의 일반적인 camel 대소문자 표기가 표시되지 않습니다.환경변수MyClass해야 합니다.MYCLASS로서 입수할 수 있습니다.myclassSpring's Environment(이 예에서는 클래스의 완전 수식 이름을 무시합니다).
클래스의 camel 대/소문자 표기가 손실되면 런타임 중에 원래 클래스 이름을 복구할 수 없습니다.따라서 환경변수의 로그 정의는 클래스가 아닌 패키지에 대해서만 작동합니다.
또한 환경변수를 통해 로깅 수준을 설정하려고 했지만 이미 언급한 바와 같이 대문자 이름의 환경변수를 사용하는 것은 불가능합니다. LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG 역시 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★application.properties ★★★★★★★★★★★★★★★★★」_JAVA_OPTIONS.
후org.springframework.boot.logging.LoggingApplicationListener가 로깅레벨을 DEBUG로로 합니다.ORG_SPRINGFRAMEWORK★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★할 수 레벨은 과 같은 형식이 합니다. LOGGING_LEVEL_org.springframework=DEBUG ★★★★★★★★★★★★★★★★★」 logging.level.org.springframework=DEBUG
스프링 부트 1.5.3으로 테스트 완료.
예, 환경 변수를 사용하여 로깅 수준을 제어할 수 있습니다.Cloud Foundry 플랫폼에 배치된 Spring Boot 애플리케이션을 위해 구현한 방법은 다음과 같습니다.
로그 구성 파일은 환경 변수에서 값을 읽기 위한 로깅 수준의 자리 표시자를 제공합니다.기본값은 INFO 입니다.
<logger name="com.mycompany.apps.cf" level="${APP_LOGGING_LEVEL:-INFO}">
<appender-ref ref="CONSOLE"/>
</logger>
그리고 CF 배포 매니페스트 파일에서 환경 변수를 제공합니다.
응용 프로그램: - 이름: my-app-name메모리: 2048env:APP_LOGGGING_LEVEL: 디버깅
이게 도움이 됐으면 좋겠어요.
Spring Boot 2.0.x부터는 다시 동작합니다.Spring Boot v2.0.9로 테스트.릴리스. 예: 연결 풀 디버깅 로그 활성화:
LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
또는 Spring 프레임워크 디버깅로그:
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG java -jar myApp.jar
또는 둘 다:
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG LOGGING_LEVEL_COM_ZAXXER=DEBUG java -jar myApp.jar
애플리케이션 속성에 대한 자세한 내용은 Spring Boot Reference Documentation의 "어플리케이션 팝티"를 참조하십시오.
또한 Cloud Foundry의 Spring Boot(v1.2.3)를 사용하여 다음과 같이 환경 변수를 사용하여 루트 로깅 수준을 조정할 수 있음을 알 수 있습니다.
$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG
유감스럽게도 (적어도 사용하고 있는 Java 빌드 팩 및 Spring Boot 버전에서는) 특정 패키지의 로깅레벨을 다이얼다운 할 수 없는 것 같습니다.예를 들어, 상기 외에 다음을 추가해도 Spring 프레임워크의 로그레벨은 감소하지 않습니다.
$ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO
그러나 Splunk 등을 사용하여 로그를 수집하는 경우에는 이음을 필터링할 수 있습니다.
가능성이 있어 보이는 또 다른 대안은 빌드 팩의 인수 옵션(여기를 참조)을 커스터마이즈하는 것입니다.
$ cf set-env <app name> '{arguments: "-logging.level.root=DEBUG -logging.level.org.springframework=INFO"}'
슬프게도, 나는 이것을 실제로 작동시킬 수 없었다.어플리케이션 코드를 변경하지 않고 패키지 레벨로 로깅 레벨을 재설정할 수 있는 것은 작업에 편리하다고 생각합니다.
어쨌든 스프링 프로파일을 사용하는 것이 좋습니다.
2개의 속성 파일을 만듭니다.
application-local.properties★★★★★★★★★★★★★★★★★」application-remote.properties(프로파일명은 분명히 다를 수 있습니다)
각 파일의 로그레벨을 적절히 설정합니다).
logging.level.org.springframework)응용 프로그램 실행 방법
-Dspring.profiles.active=local국소적으로-Dspring.profiles.active=remoteCF용입니다.
스프링 부트 2.0.0에서 추가--trace동작한다. 예를 들어java -jar myapp.jar --debug또는java -jar myapp.jar --trace
다음은 Janino에서 Logback을 사용하여 속성 또는 환경변수를 통해 다양한 로깅 구성을 조건부로 포함하는 예제입니다.기본 구성 logback.xml이 개발 콘솔 로깅 또는 운영 파일 로깅에 조건을 사용하고 있습니다.다음 파일을 드롭하기만 하면 됩니다./resources/
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<if condition='property("spring.profiles.active").contains("dev")'>
<then>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<include resource="dev.xml" optional="true"/>
</then>
</if>
<if condition='property("spring.profiles.active").contains("pro")'>
<then>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<include resource="pro.xml" optional="true"/>
</then>
</if>
</configuration>
dev.xml
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>utf-8</charset>
<Pattern>%-30([%p] [%c:%L]) » %m%n%rEx</Pattern>
</encoder>
</appender>
<!-- CHATTY LOGGERS HERE.-->
<logger name="org.springframework" level="DEBUG"/>
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<root level="${logback.loglevel}">
<appender-ref ref="CONSOLE"/>
</root>
</included>
pro.xml
<included>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/>
<property name="FILE_NAME_PATTERN" value="./logs/%d{yyyy-MM-dd}-exec.log"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>FILE_NAME_PATTERN</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!-- APP SPECIFIC LOGGERS HERE.-->
<logger name="org.springframework.boot.SpringApplication" level="INFO"/>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</included>
패키지에 대한 환경 변수를 통해 로그 수준을 설정하는 것은 작동하지만 단일 클래스에 대한 로그 수준을 설정하는 것은 작동하지 않습니다.이는 Spring Boot 2/Log level 및 Spring Boot 2/Log level 레퍼런스 문서에 기재되어 있습니다.
은, 「로그 레벨」을 사용해 .SPRING_APPLICATION_JSON이치노
SPRING_APPLICATION_JSON='{"logging.level.org.hibernate.SQL":"DEBUG","logging.level.org.hibernate.type.descriptor.sql.BasicBinder":"TRACE"}'
★★★★★★를 사용해 .banner.txt모든 환경변수를 인쇄하고 시작 및 종료 문자를 사용합니다.
추출된 배너를 예외 없이 볼 수 있다면 분명 추적에 도움이 될 것입니다.
클라우드에서는 로그를 보다 쉽게 볼 수 있습니다.
############################
spring.datasource.url=jdbc:oracle:thin:***
spring.datasource.username=XXXXX
spring.datasource.password=XXXXX
auth.basic=false
auth.local-client-server=true
auth.windows-login=false
auth.windows-login.service-principal=${auth.windows-login.service.principal}
############################
언급URL : https://stackoverflow.com/questions/34181094/set-logging-level-in-spring-boot-via-environment-variable
'source' 카테고리의 다른 글
| JsonResult에서 jQuery ajax 오류 메서드로 사용자 지정 오류를 반환할 수 있습니까? (0) | 2023.02.27 |
|---|---|
| React.js의 img에 대한 올바른 경로 (0) | 2023.02.27 |
| 지시어 간 AngularJS 통신 (0) | 2023.02.27 |
| $mdDialog Stacked/Nated 대화상자, 가능한가요? (0) | 2023.02.27 |
| React에서 동적 소품 이름을 생성하는 방법은 무엇입니까? (0) | 2023.02.27 |