>  기사  >  백엔드 개발  >  Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

不言
不言원래의
2018-05-05 15:11:491886검색

이 글은 주로 Spring Boot 로깅 프레임워크의 실습을 공유합니다. 코드 부분도 매우 자세하게 설명되어 있어 도움이 필요한 친구들이 참고할 수 있습니다.


개요

Java 애플리케이션에서 로그는 일반적으로 다음 5개 수준으로 나뉩니다.

  • ERROR 오류 메시지

  • WARN 경고 메시지

  • INFO 일반 정보

  • DEBUG 디버그 정보

  • TRACE 추적 정보

Spring Boot는 Apache의 Commons Logging을 내부 로깅 프레임워크로 사용합니다. 이는 단지 로그 인터페이스일 뿐이며, 이 인터페이스에 해당하는 로그 구현을 지정해야 합니다.

SpringBt의 기본 로깅 구현은 JDK와 함께 제공되는 로깅 패키지인 Java Util Logging입니다. 또한 SpringBt는 물론 Log4J 및 Logback과 같은 널리 사용되는 로깅 구현도 지원합니다.

위의 로그 구현을 통칭하여 로그 프레임워크

라고 부릅니다. 지금 연습해 보세요!


Spring Boot Logging 플러그인을 사용하세요

  • 먼저 application.properties 파일에 구성을 추가하세요:

logging.level.root=INFO
  • 컨트롤러 부분 코드는 다음과 같습니다:

package com.hansonwang99.controller;

import com.hansonwang99.K8sresctrlApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testlogging")
public class LoggingTestController {
    private static Logger logger = LoggerFactory.getLogger(K8sresctrlApplication.class);
    @GetMapping("/hello")
    public String hello() {
        logger.info("test logging...");
        return "hello";
    }
}
  • 실행 결과

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

로그 수준이 INFO로 설정되어 있으므로 INFO 이상의 수준을 포함하는 로그 정보가 인쇄됩니다.

여기서 볼 수 있듯이 대부분의 INFO 로그는 SpringBt 프레임워크 자체에서 생성됩니다. 이를 차단하려면 먼저 모든 로그 수준을 ERROR로 설정하여 프레임워크 자체 INFO 정보가 인쇄되지 않도록 할 수 있습니다. 그런 다음 애플리케이션의 특정 패키지를 DEBUG 수준 로그로 설정하면 관심 있는 패키지에서 DEBUG 및 상위 수준 로그만 볼 수 있습니다.

  • 특정 패키지의 로그 수준 제어

application.yml에서 구성을 변경하세요

logging:
  level:
    root: error
    com.hansonwang99.controller: debug

분명히 루트 로그 수준을 ERROR로 설정한 다음 com.hansonwang99.controller를 추가하세요. code> 패키지 로그 수준이 DEBUG로 설정됩니다. 즉, 먼저 모두 금지하고 개별 설정 방법을 허용합니다<code>com.hansonwang99.controller包的日志级别设为DEBUG,此即:即先禁止所有再允许个别的 设置方法

  • 控制器代码

package com.hansonwang99.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testlogging")
public class LoggingTestController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @GetMapping("/hello")
    public String hello() {
        logger.info("test logging...");
        return "hello";
    }
}
  • 运行结果

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

可见框架自身的INFO级别日志全部藏匿,而指定包中的日志按级别顺利地打印出来

  • 将日志输出到某个文件中

logging:
  level:
    root: error
    com.hansonwang99.controller: debug
  file: ${user.home}/logs/hello.log
  • 运行结果

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

使用Spring Boot Logging,我们发现虽然日志已输出到文件中,但控制台中依然会打印一份,发现用org.slf4j.Logger是无法解决这个问题的

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유


集成Log4J日志框架

  • pom.xml中添加依赖

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
  • 在resources目录下添加log4j2.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appenders>
        <File name="file" fileName="${sys:user.home}/logs/hello2.log">
            <PatternLayout pattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"/>
        </File>
    </appenders>

    <loggers>

        <root level="ERROR">
            <appender-ref ref="file"/>
        </root>
        <logger name="com.hansonwang99.controller" level="DEBUG" />
    </loggers>

</configuration>
  • 其他代码都保持不变

运行程序发现控制台没有日志输出,而hello2.log文件中有内容,这符合我们的预期:

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

而且日志格式和pattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"


Controller code

  •         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>

  • Run results
  • Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유
    프레임워크 자체의 INFO 레벨 로그는 모두 숨겨져 있는 것을 볼 수 있으며, 로그는 지정된 패키지가 레벨별로 원활하게 출력됩니다
  • 로그를 파일로 출력
  • <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="warn">
        <properties>
    
            <Property name="app_name">springboot-web</Property>
            <Property name="log_path">logs/${app_name}</Property>
    
        </properties>
        <appenders>
            <console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="[%d][%t][%p][%l] %m%n" />
            </console>
    
            <RollingFile name="RollingFileInfo" fileName="${log_path}/info.log"
                         filePattern="${log_path}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
                <Filters>
                    <ThresholdFilter level="INFO" />
                    <ThresholdFilter level="WARN" onMatch="DENY"
                                     onMismatch="NEUTRAL" />
                </Filters>
                <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
                <Policies>
                    <!-- 归档每天的文件 -->
                    <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    <!-- 限制单个文件大小 -->
                    <SizeBasedTriggeringPolicy size="2 MB" />
                </Policies>
                <!-- 限制每天文件个数 -->
                <DefaultRolloverStrategy compressionLevel="0" max="10"/>
            </RollingFile>
    
            <RollingFile name="RollingFileWarn" fileName="${log_path}/warn.log"
                         filePattern="${log_path}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
                <Filters>
                    <ThresholdFilter level="WARN" />
                    <ThresholdFilter level="ERROR" onMatch="DENY"
                                     onMismatch="NEUTRAL" />
                </Filters>
                <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
                <Policies>
                    <!-- 归档每天的文件 -->
                    <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    <!-- 限制单个文件大小 -->
                    <SizeBasedTriggeringPolicy size="2 MB" />
                </Policies>
                <!-- 限制每天文件个数 -->
                <DefaultRolloverStrategy compressionLevel="0" max="10"/>
            </RollingFile>
    
            <RollingFile name="RollingFileError" fileName="${log_path}/error.log"
                         filePattern="${log_path}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
                <ThresholdFilter level="ERROR" />
                <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
                <Policies>
                    <!-- 归档每天的文件 -->
                    <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    <!-- 限制单个文件大小 -->
                    <SizeBasedTriggeringPolicy size="2 MB" />
                </Policies>
                <!-- 限制每天文件个数 -->
                <DefaultRolloverStrategy compressionLevel="0" max="10"/>
            </RollingFile>
    
        </appenders>
    
        <loggers>
    
    
            <root level="info">
                <appender-ref ref="Console" />
                <appender-ref ref="RollingFileInfo" />
                <appender-ref ref="RollingFileWarn" />
                <appender-ref ref="RollingFileError" />
            </root>
    
        </loggers>
    
    </configuration>

  • 실행 결과

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

🎜Spring Boot Logging을 사용하여 로그가 파일로 출력되었지만 콘솔에는 여전히 복사본이 인쇄된다는 것을 발견했습니다. org.slf4j.Logger를 사용하여 발견했습니다. 이 문제를 해결할 수 없습니다🎜🎜🎜Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유🎜🎜🎜🎜Log4J 로깅 프레임워크 통합🎜🎜 🎜🎜pom.xml🎜🎜🎜
package com.hansonwang99.controller;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/testlogging")
public class LoggingTestController {
    private final Logger logger = LogManager.getLogger(this.getClass());
    @GetMapping("/hello")
    public String hello() {
        for(int i=0;i<10_0000;i++){
            logger.info("info execute index method");
            logger.warn("warn execute index method");
            logger.error("error execute index method");
        }
        return "My First SpringBoot Application";
    }
}
에 종속성을 추가합니다. 🎜🎜🎜다음 내용으로 리소스 디렉터리에 log4j2.xml 파일을 추가합니다. 🎜🎜🎜rrreee🎜🎜🎜다른 코드는 변경되지 않습니다.🎜 🎜🎜🎜프로그램을 실행하고 콘솔에 로그 출력이 없음을 확인하세요. hello2.log 파일에 우리의 기대와 일치하는 콘텐츠가 있습니다: 🎜🎜🎜Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유 🎜🎜🎜🎜Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유🎜🎜🎜🎜Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유🎜🎜🎜 그리고 로그 형식은 pattern="%d{HH:mm:ss,SSS} %p %c (%L)입니다 - %m%n" 형식에 정의된 것과 일치합니다 🎜🎜🎜Log4J 추가 연습 🎜🎜🎜🎜pom.xml 구성: 🎜🎜🎜rrreee🎜🎜🎜log4j2.xml 구성🎜 🎜🎜rrreee🎜🎜🎜컨트롤러 코드: 🎜🎜🎜rrreee🎜🎜🎜실행 결과 🎜🎜🎜🎜🎜🎜🎜🎜🎜 🎜🎜🎜🎜

Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유

로그는 레벨에 따라 다른 파일로 저장됩니다. 로그 파일 크기가 2M를 초과하면 압축 저장을 위해 여러 파일로 분할됩니다. 프로덕션 환경에서는 로그 파일 크기를 권장합니다. 20~50MB로 조정되었습니다.


Postscript

저자의 더 많은 원본 기사를 보려면 SF 칼럼을 참조하세요.

저자의 더 많은 SpringBt 실습 기사는 여기에 있습니다:

  • SpringBoot의 ElasticSearch 검색 엔진 실습

  • Kotlin+SpringBoot의 예비 탐색 공동 프로그래밍



관련 권장 사항:

Java 프로그래머가 가장 일반적으로 사용하는 8가지 Java 로깅 프레임워크

위 내용은 Spring Boot 로깅 프레임워크 실습 - hansonwang99 님의 기술 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Mac에 PHP Xdebug 설치다음 기사:Mac에 PHP Xdebug 설치