SpringBoot 에서 logback 로그 설정 파일 로드 순서&설정 기록

54128 단어 SpringBootJava
SpringBoot 에서 logback 로그 설정 파일 로드 순서&설정 기록
springboot 로 그 를 불 러 오 는 프로필 은 두 가지 가 있 습 니 다.하 나 는 logback 자체 의 프로필 을 불 러 오 는 것 이 고,다른 하 나 는 spring 특성 을 가 진 logback 프로필 을 불 러 오 는 것 입 니 다.
classpath 에서 파일 logback 자체 설정 파일 을 찾 으 려 고 시도 합 니 다:
먼저 logback-test.groovy 찾기;
파일 이 존재 하지 않 으 면 파일 logback-test.xml 을 찾 습 니 다.
파일 이 존재 하지 않 으 면 파일 logback.groovy 를 찾 습 니 다.
파일 이 존재 하지 않 으 면 파일 logback.xml 을 찾 습 니 다.
위 설정 파일 이 존재 하지 않 는 다 면 springboot 자체 의 spring 특성 을 가 진 logback 설정 파일 을 불 러 옵 니 다.불 러 오 는 순서 와 logback 자체 설정 파일 이 일치 합 니 다.모든 프로필 의 끝 에"-spring."을 추가 하지 않 습 니 다.
  • logback 자체 프로필 과 spring 특성 을 가 진 logback 프로필 이 존재 한다 면 logback 자체 프로필 을 우선 불 러 옵 니 다.xxx-spring.xml 우선 순위 가 가장 낮 습 니 다
  • 로그 시스템 이 초기 화 되 기 전에 로그 출력 에 DEBUG 가 있 습 니 다.현재 logback-spring 이 적용 되 지 않 았 기 때문에 spring boot 의 기본 로그 단 계 는 DEBUG 입 니 다

  • 4.567917.일부 의존 하 는 라 이브 러 리 로그 출력 이 제어 되 지 않 는 이 유 는 최종 적 으로 사용 하 는 logger 가 logback 이 아니 기 때 문 입 니 다.예 를 들 어 사용 하 는 log4j 입 니 다.Spring Boot 에서 JUnit 테스트 를 사용 할 때 SpringBootTest 주 해 를 사용 하 는 지 여 부 는 로그 시스템 초기 화 시 차이 가 있 습 니 다로드 프로 세 스
    LoggingSystem
    AbstractLoggingSystem
    Slf4JLoggingSystem
    LogbackLoggingSystem
    Log4J2LoggingSystem
    원본 코드 를 보다
  • Spring 응용 프로그램 이 시 작 될 때 해당 하 는 로그 인 스 턴 스 를 먼저 가 져 옵 니 다
  • // org.springframework.boot.logging.LoggingApplicationListener
    private void onApplicationStartedEvent(ApplicationStartedEvent event) {
    	this.loggingSystem = LoggingSystem
    			.get(event.getSpringApplication().getClassLoader());
    	this.loggingSystem.beforeInitialize();
    }
    
  • 로그 시스템 을 검 측 하고 가 져 옵 니 다.검 측 순 서 는 SYSTEMS 에서 정 의 됩 니 다.마지막 으로 반 사 를 통 해 LogbackLoggingSystem 인 스 턴 스 를 만 듭 니 다
  • // 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);
    }
    
  • 그리고 ApplicationEnvironment Prepared Event 이후 logback 을 초기 화 합 니 다
  • 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);
    }
    
  • logback 자체 프로필 의 효력 발생 순서.
  • // org.springframework.boot.logging.logback.LogbackLoggingSystem
    @Override
    protected String[] getStandardConfigLocations() {
    	return new String[] { "logback-test.groovy", "logback-test.xml", "logback.groovy",
    			"logback.xml" };
    }
    
  • spring boot 에서 지원 하 는 logback 설정 파일 형식 을 볼 수 있 습 니 다.바로 logback 자체 설정 파일(logback-test.xml,logback.xml 등)을 바탕 으로 파일 이름 뒤에'-spring'을 추가 한 것 입 니 다.예 를 들 어 logback-test-spring,logback-spring 등 입 니 다
  • /**
     * 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 의 능력 을 향상 시 킵 니 다.
  • springProfile라벨 은 파일 을 더욱 유연 하 게 설정 할 수 있 고 설정 부분 을 선택 적 으로 포함 하거나 제외 할 수 있 습 니 다.요소 의 모든 위 치 는 윤곽 부분 을 지원 합 니 다.이 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>
    
    
  • springProperty 1라벨 은 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 등).
  • logback-spring.xml
  • 
    <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>
    

    좋은 웹페이지 즐겨찾기