spring boot 는 logback 로그 단계 인쇄 제어 동작 을 사용 합 니 다.
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>
%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 에 있 는
private static final Logger logger = LoggerFactory.getLogger(Class.class);
이렇게 사용 하 는 것 은 logback.xml 의이렇게 하면 기본적으로 서로 다른 업무 논리 로 서로 다른 파일 에 인쇄 되 는 것 을 실현 하 였 다.
추가: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>
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.