SpringBoot 에서 logback 로그 설정 파일 로드 순서&설정 기록
54128 단어 SpringBootJava
springboot 로 그 를 불 러 오 는 프로필 은 두 가지 가 있 습 니 다.하 나 는 logback 자체 의 프로필 을 불 러 오 는 것 이 고,다른 하 나 는 spring 특성 을 가 진 logback 프로필 을 불 러 오 는 것 입 니 다.
classpath 에서 파일 logback 자체 설정 파일 을 찾 으 려 고 시도 합 니 다:
먼저 logback-test.groovy 찾기;
파일 이 존재 하지 않 으 면 파일 logback-test.xml 을 찾 습 니 다.
파일 이 존재 하지 않 으 면 파일 logback.groovy 를 찾 습 니 다.
파일 이 존재 하지 않 으 면 파일 logback.xml 을 찾 습 니 다.
위 설정 파일 이 존재 하지 않 는 다 면 springboot 자체 의 spring 특성 을 가 진 logback 설정 파일 을 불 러 옵 니 다.불 러 오 는 순서 와 logback 자체 설정 파일 이 일치 합 니 다.모든 프로필 의 끝 에"-spring."을 추가 하지 않 습 니 다.
4.567917.일부 의존 하 는 라 이브 러 리 로그 출력 이 제어 되 지 않 는 이 유 는 최종 적 으로 사용 하 는 logger 가 logback 이 아니 기 때 문 입 니 다.예 를 들 어 사용 하 는 log4j 입 니 다.Spring Boot 에서 JUnit 테스트 를 사용 할 때 SpringBootTest 주 해 를 사용 하 는 지 여 부 는 로그 시스템 초기 화 시 차이 가 있 습 니 다로드 프로 세 스
LoggingSystem
AbstractLoggingSystem
Slf4JLoggingSystem
LogbackLoggingSystem
Log4J2LoggingSystem
원본 코드 를 보다
// org.springframework.boot.logging.LoggingApplicationListener
private void onApplicationStartedEvent(ApplicationStartedEvent event) {
this.loggingSystem = LoggingSystem
.get(event.getSpringApplication().getClassLoader());
this.loggingSystem.beforeInitialize();
}
// org.springframework.boot.logging.LoggingSystem
public static LoggingSystem get(ClassLoader classLoader) {
String loggingSystem = System.getProperty(SYSTEM_PROPERTY);// null
if (StringUtils.hasLength(loggingSystem)) {
if (NONE.equals(loggingSystem)) {
return new NoOpLoggingSystem();
}
return get(classLoader, loggingSystem);
}
for (Map.Entry<String, String> entry : SYSTEMS.entrySet()) {
if (ClassUtils.isPresent(entry.getKey(), classLoader)) {
return get(classLoader, entry.getValue());
}
}
throw new IllegalStateException("No suitable logging system located");
}
/**
* A System property that can be used to indicate the {@link LoggingSystem} to use.
*/
public static final String SYSTEM_PROPERTY = LoggingSystem.class.getName();
private static final Map<String, String> SYSTEMS;
static {
Map<String, String> systems = new LinkedHashMap<String, String>();
systems.put("ch.qos.logback.core.Appender",
"org.springframework.boot.logging.logback.LogbackLoggingSystem");
systems.put("org.apache.logging.log4j.core.impl.Log4jContextFactory",
"org.springframework.boot.logging.log4j2.Log4J2LoggingSystem");
systems.put("java.util.logging.LogManager",
"org.springframework.boot.logging.java.JavaLoggingSystem");
SYSTEMS = Collections.unmodifiableMap(systems);
}
private void onApplicationEnvironmentPreparedEvent(
ApplicationEnvironmentPreparedEvent event) {
if (this.loggingSystem == null) {
this.loggingSystem = LoggingSystem
.get(event.getSpringApplication().getClassLoader());
}
initialize(event.getEnvironment(), event.getSpringApplication().getClassLoader());
}
/**
* Initialize the logging system according to preferences expressed through the
* {@link Environment} and the classpath.
* @param environment the environment
* @param classLoader the classloader
*/
protected void initialize(ConfigurableEnvironment environment,
ClassLoader classLoader) {
new LoggingSystemProperties(environment).apply();
LogFile logFile = LogFile.get(environment);
if (logFile != null) {
logFile.applyToSystemProperties();
}
initializeEarlyLoggingLevel(environment);
initializeSystem(environment, this.loggingSystem, logFile);
initializeFinalLoggingLevels(environment, this.loggingSystem);
registerShutdownHookIfNecessary(environment, this.loggingSystem);
}
4.567917.프로필 검 측 과정 을 중점적으로 봅 니 다
private void initializeWithConventions(
LoggingInitializationContext initializationContext, LogFile logFile) {
// logback
String config = getSelfInitializationConfig();
if (config != null && logFile == null) {
// self initialization has occurred, reinitialize in case of property changes
reinitialize(initializationContext);
return;
}
// spring logback
if (config == null) {
config = getSpringInitializationConfig();
}
if (config != null) {
loadConfiguration(initializationContext, config, logFile);
return;
}
loadDefaults(initializationContext, logFile);
}
// org.springframework.boot.logging.logback.LogbackLoggingSystem
@Override
protected String[] getStandardConfigLocations() {
return new String[] { "logback-test.groovy", "logback-test.xml", "logback.groovy",
"logback.xml" };
}
/**
* Return the spring config locations for this system. By default this method returns
* a set of locations based on {@link #getStandardConfigLocations()}.
* @return the spring config locations
* @see #getSpringInitializationConfig()
*/
protected String[] getSpringConfigLocations() {
String[] locations = getStandardConfigLocations();
for (int i = 0; i < locations.length; i++) {
String extension = StringUtils.getFilenameExtension(locations[i]);
locations[i] = locations[i].substring(0,
locations[i].length() - extension.length() - 1) + "-spring."
+ extension;
}
return locations;
}
메모:Spring Boot 에서 JUnit 을 사용 할 때 SpringBootTest 주 해 를 설정 하지 않 으 면 로그 시스템 이 초기 화 되 지 않 습 니 다.org.slf4j.impl.StaticLoggerBinder 를 사용 하여 가 져 옵 니 다.test/resource 아래 logback-test.xml 이 존재 하면 시스템 의 기본 설정 을 사용 합 니 다.SpringBootTest 주 해 를 설정 하면 SpringBoot 가 정상적으로 초기 화 되 고 로그 시스템 이 정상적으로 불 러 옵 니 다.
spring 특성 을 가 진 logback 설정 파일 을 계속 말 하고 있 습 니 다.어떤 특성 을 가지 고 있 습 니까?응용 프로그램.*속성 을 사용 할 수 있 습 니 다.이러한 신 작업 은 실행 중인 spring boot jar 패키지 외 에 application 프로필 만 사용 하면 로그 의 출력 경로 와 단 계 를 제어 할 수 있 습 니 다.jar 패키지 외 에 로그 프로필 을 설정 하지 않 아 도 됩 니 다.springProfile 과 springProperty 를 사용 하여 logback.xm 의 능력 을 향상 시 킵 니 다.
라벨 은 파일 을 더욱 유연 하 게 설정 할 수 있 고 설정 부분 을 선택 적 으로 포함 하거나 제외 할 수 있 습 니 다.요소 의 모든 위 치 는 윤곽 부분 을 지원 합 니 다.이 name 속성 을 사용 하여 설정 을 받 을 프로필 을 지정 합 니 다.쉼표 구분자 목록 을 사용 하여 여러 개의 프로필 을 지정 할 수 있 습 니 다<springProfile name="dev">
springProfile>
<springProfile name="dev,test">
springProfile>
<springProfile name="!prod">
springProfile>
예시
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
root>
springProfile>
<springProfile name="test">
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
root>
springProfile>
라벨 은 Spring 에서 속성 을 표시 할 수 있 습 니 다.Environment 는 Logback 에서 사용 할 수 있 도록 합 니 다.응용 프로그램.properties 를 리 턴 설정 에서 파일 의 값 에 접근 하려 면 2.태그 의 작업 방식 은 Logback 의 표준 태그 와 유사 하지만 직접 value 가 source 속성(Environment)을 지정 하 는 것 은 아 닙 니 다.scope 는 local 범위 밖의 다른 위치 에 속성 을 저장 하려 면 이 속성 을 사용 할 수 있 습 니 다.이 속성 이 설정 되 지 않 은 것 을 방지 하기 위해 예비 값 이 필요 하 다 면 Environment 는 이 defaultValue 속성 을 사용 할 수 있 습 니 다<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host" defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>${fluentHost}remoteHost>
appender>
예시
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="localhost.log"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/${logName}.logfile>
<append>trueappend>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/${logName}-%d{yyyy-MM-dd}.%i.log.zipfileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>7maxHistory>
<totalSizeCap>3GBtotalSizeCap>
rollingPolicy>
<encoder>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line] --%mdc{client} %msg%npattern>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUGlevel>
filter>
appender>
Relaxed Property Resolver 를 환경 속성 에 접근 하 는 데 사용 합 니 다.허 선 기 호 를 사용 하여 source(my-property-name)를 지정 하면 모든 변 화 를 시도 합 니 다(my Property Name,MYPROPERTY_NAME 등).
<configuration scan="true" debug="false">
<springProperty scope="context" name="LEVEL" source="logging.level.root"/>
<springProperty scope="context" name="LOG_HOME" source="logging.path"/>
<springProperty scope="context" name="APP" source="logging.info.name"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[test] %d{yy-MM-dd.HH:mm:ss.SSS} [%-2t] %-5p %-22c{0} %X{ServiceId} - %m%npattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
<File>${LOG_HOME}/${APP}.logFile>
<encoder>
<pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%npattern>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP}_%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>30maxHistory>
rollingPolicy>
appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender" additivity="false">
<File>${LOG_HOME}/error.logFile>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERRORlevel>
filter>
<encoder>
<pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%npattern>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error_%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>30maxHistory>
rollingPolicy>
appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR" />
root>
configuration>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.