spring boot 는 logback 로그 단계 인쇄 제어 동작 을 사용 합 니 다.

회사 업무 가 필요 하기 때문에 성능 로그 와 업무 로 그 를 분리 하여 인쇄 하고 elk 로 수집 하여 처리 해 야 하기 때문에 서로 다른 업무 로 그 를 서로 다른 파일 로 인쇄 해 야 합 니 다.
spring boot 자체 로고 백 을 사용 합 니 다.
우선 yml 파일 에 logback.xml 파일 을 설정 합 니 다.기본적으로 resources 에서 logback.xml 파일 을 찾 습 니 다.yml 파일 에서 logging.config 에서 지정 한 파일 을 찾 을 수 없습니다.

logging:
 level: DEBUG
 config: classpath:logback.xml
logback.xml 는 logback 의 설정 파일 입 니 다.인쇄 파일 의 경로,형식,인쇄 를 걸 러 내 는 단계 등 을 설정 할 수 있 습 니 다.logback.xml 파일 을 살 펴 보 겠 습 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<!--   -->
<configuration>
  <!--    ,name    ,value  ,    ${   }    -->
  <property name="APPDIR" value="log" />
  <property name="LOG_HOME" value="/var/app/logs" />
  <property name="APPNAME" value="app_test" />
  <property name="MDC_LOG_PATTERN"
  value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %p app_test %t %logger{50} [line:%L %msg]%n"></property> 
 
  <!--        ,       -->
  <!--              ,logback           appender-->
  <!--RollingFileAppender,      ,           ,        ,          -->
  <appender name="performanceAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--                -->
    <file>${LOG_HOME}/${APPNAME}/performanceLog/${APPNAME}.log</file>
    <!--           ,   ,      -->
    <!--TimeBasedRollingPolicy              ,       fileNamePattern          -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--           ,     2018-12-19  ,           file    ,       file             ,                      。
         2018-12-01       fileNamePattern  。%d{yyyy-MM-dd}      ,%i     -->
      <fileNamePattern>${LOG_HOME}/${APPNAME}/performanceLog/${APPNAME}-%d{yyyyMMdd}.%i.log</fileNamePattern>
      <!--         ,            50Mb,   50Mb,        0  ,       ,  app_test-20181219.0.log -->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!--  50mb-->
        <maxFileSize>50MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <!--          -->
    <append>true</append>
    <!--            -->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{yyyy/MM/dd' 'HH:mm:ss.SSS} %X{req.requestId}[line:%L %msg] %n</pattern>
      <charset>utf-8</charset>
    </encoder>
     <!--        info   -->
    <!--filter      -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <!--    -->
      <level>info</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender> 
 
  <!--        ,       -->
  <appender name="bizAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--                  -->
    <file>${LOG_HOME}/${APPNAME}/bizLog/${APPNAME}.log</file>
    <!--           ,   ,     -->
 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      
      <fileNamePattern>${LOG_HOME}/${APPNAME}/bizLog/${APPNAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <!--         ,            50M,   50M,        0  ,       ,  bizlog-biz-20181219.0.log -->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>50MB</maxFileSize>
        <!--    3 -->
        <!--<MaxHistory>3</MaxHistory>-->
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <!--          -->
    <append>true</append>
    <!--         -->
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{yyyy/MM/dd' 'HH:mm:ss.SSS} %X{req.requestId}[line:%L %msg] %n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <!--         info    -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>info</level>
      <level>error</level>
      <!--<onMatch>ACCEPT</onMatch>-->
      <!--<onMismatch>DENY</onMismatch>-->
    </filter>
  </appender>
 
  <!--ConsoleAppender        -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--encoder      PatternLayoutEncoder-->
    <encoder>
      <pattern>${MDC_LOG_PATTERN}</pattern>
      <charset>utf-8</charset>
    </encoder>
    <!--   appender      ,       ,                        -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>all</level>
    </filter>
  </appender>
 
  <!--  LoggerFactory.getLogger("performanceLogger")     logger-->
  <logger name="performanceLogger" additivity="false">
    <!--     Appender-->
    <appender-ref ref="performanceAppender" />
 
  </logger>
  <!-- loger。    level  ,        "root".-->
  <root level="info">
    <appender-ref ref="bizAppender" />
    <appender-ref ref="STDOUT" />
 
  </root> 
</configuration>
:루트 탭,모든 탭 이 안에 있 습 니 다.
:속성 탭,변 수 를 설정 합 니 다.name 은 변수 이름,value 는 값 입 니 다.${변수 이름}방식 으로 사용 할 수 있 습 니 다.
:로 그 를 기록 하 는 이벤트 가 시 작 될 때 logback 은 이 이 벤트 를 appender 에 보 냅 니 다.자주 사용 하 는 것 은 ch.qos.logback.core.consoleAppender 와 ch.qos.logback.core.rolling.RollingFileAppender 입 니 다.ConsoleAppender 는 콘 솔 에 인쇄 되 어 있 습 니 다.RollingFileAppender 는 스크롤 기록 파일 입 니 다.로 그 를 지정 한 파일 에 기록 합 니 다.어떤 조건 에 부합 할 때 로 그 를 다른 파일 에 기록 합 니 다.
:에 기 록 된 로그 파일 의 경로 와 파일 이름 을 사용 합 니 다.
:하 도 급 정책 은 전날 로그 의 저장 파일 이름,크기,압축 형식,저장 일수 입 니 다.ch.qos.logback.core.rolling.TimeBased Rolling Policy:시간 에 기반 한 하 도 급 정책 을 실현 합 니 다.하 도 급 간격 은에서 지정 한 이벤트 의 최소 단위 입 니 다.
:로 그 를 저장 하 는 경로 와 이름 입 니 다.
:파일 마다 최대 파일 입 니 다.
:로그 파일 의 형식 과 인 코딩.
:로그 인 코딩 형식 입 니 다.
:로그 인쇄 형식 을 설정 합 니 다.
:로그 필터.
:로그 필터 단계,TRACE,DEBUG,INFO,WARN,ERROR,ALL 과 OFF.
:LoggerFactory.getLogger("permanceLogger")를 사용 하여 이 logger 를 사용 합 니 다.
:루트 loger.하나의 level 속성 만 있 습 니 다."root"라 고 명명 되 어야 합 니 다.
%d{yyy/MM/dd'HH:mm:ss.SSS}:시간 포맷 입 니 다.2018/12/19 17:31:17.126
%X{req.requestId}:MDC 클래스 에 req.requestId 인 자 를 추가 하면 logback.xml 에서 사용 할 수 있 습 니 다.다음은 MDC 클래스 입 니 다.
%p:INFO,ERROR 등 로그 단계 정 보 를 출력 합 니 다.
%t:스 레 드 나 어떤 종류의 로 그 를 인쇄 합 니까?
%L:현재 줄 수 를 출력 합 니 다.
%msg:로그 정보 입 니 다.바로 logger.info("xxx"),xxx 는%msg 입 니 다.
%n:줄 바 꾸 기.
MDC
우리 가 온라인 문 제 를 진단 하 는 데 편리 하도록 나타 난 방법 도구 류 입 니 다.

public class MDC {
 //Put a context value as identified by key
 //into the current thread's context map.
 public static void put(String key, String val);
 
 //Get the context identified by the key parameter.
 public static String get(String key);
 
 //Remove the context identified by the key parameter.
 public static void remove(String key);
 
 //Clear all entries in the MDC.
 public static void clear();
}
기본 사용

MDC.put("req.requestId", uuid);
MDC.put("req.remoteHost", request.getRemoteHost());
<pattern>%d{yyyy/MM/dd' 'HH:mm:ss.SSS} %X{req.requestId}[line:%L %msg] %n</pattern>
logback.xml 에서%X{req.requestId}을 사용 하여 uid 를 얻 을 수 있 습 니 다.
다른 파일 로 인쇄

private final static Logger performanceLogger = LoggerFactory.getLogger("performanceLogger");
이렇게 하면 logback.xml 에 있 는의 permanceLogger 를 사용 할 수 있 습 니 다.permanceLogger 는 permanceAppender 를 참조 합 니 다.

private static final Logger logger = LoggerFactory.getLogger(Class.class);
이렇게 사용 하 는 것 은 logback.xml 의태그 에 있 는 bizAppender 입 니 다.
이렇게 하면 기본적으로 서로 다른 업무 논리 로 서로 다른 파일 에 인쇄 되 는 것 을 실현 하 였 다.
추가:Springboot 는 logback 을 사용 하여 각 단계 로 그 를 각각 다른 경로 로 출력 합 니 다.
SpringBoot 는 기본적으로 로그 프레임 워 크(예:Logback)에 의존 하고 있 으 며,추천 하 는 것 도 Logback 입 니 다.따라서 이번 프로젝트 에 서 는 Logback 로그 설정 을 추가 하여 각 단계 로 그 를 각각 다른 경로 로 출력 할 것 입 니 다.
SpringBoot 는 Logback 에 의존 하기 때문에 수 동 으로 의존 을 추가 할 필요 가 없습니다.
SpringBoot 는 resources 디 렉 터 리 에 새 logback-spring.xml 을 자동 으로 식별 하고 읽 기 때문에 application.yml 에서 다른 설정 을 할 필요 가 없습니다.
설정 파일 은 다음 과 같 습 니 다:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!--      -->
  <property name="PROJECT_NAME" value="XXXXX" />
 
  <!--        -->
  <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
  <!--        -->
  <property name="OPEN_FILE_PATH" value="logs/manager"/>
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>${PATTERN}</pattern>
      <charset>UTF-8</charset>
    </encoder>
  </appender>
 
  <!-- ch.qos.logback.core.rolling.RollingFileAppender        -->
  <appender name="OPEN-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--       !!!!!-->
    <!--<Encoding>UTF-8</Encoding>-->
    <!--<File>${OPEN_FILE_PATH}/zqread.log</File>-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--          -->
      <FileNamePattern>${OPEN_FILE_PATH}/all/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <!--        -->
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!--         -->
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
 
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>${PATTERN}</pattern>
    </layout>
  </appender>
 
  <!--   debug-->
  <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/debug/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!--    DEBUG   -->
      <level>DEBUG</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!--   info-->
  <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/info/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!--    INFO   -->
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!--   error-->
  <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/error/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!--    ERROR   -->
      <level>ERROR</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!--   warn-->
  <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>${OPEN_FILE_PATH}/warn/zqread.%d{yyyy-MM-dd}-%i.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
      <TimeBasedFileNamingAndTriggeringPolicy
          class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <MaxFileSize>10MB</MaxFileSize>
      </TimeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <append>true</append>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
      <charset>utf-8</charset>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter"><!--    WARN   -->
      <level>WARN</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <root level="info">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="OPEN-FILE"/>
    <appender-ref ref="debug" />
    <appender-ref ref="info" />
    <appender-ref ref="error" />
    <appender-ref ref="warn" />
  </root>
</configuration>
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기