slf4j 를 사용하여 로그를 남기는 방법
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class LogController {
private val logger = LoggerFactory.getLogger("LoggerController 의 소피로그")
@GetMapping("/log")
fun log() {
logger.info("~~~~~~~~~~Hi ALLL~~~~ SophieLog ~~~~~~")
logger.error("~~~~~~~~~~Hi ALLL~~~~ SophieERRORLog ~~~~~~")
}
}
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@Service
class LogService {
private val logger = LoggerFactory.getLogger(this.javaClass.simpleName)
fun log() {
logger.trace("Trace")
logger.debug("Debug")
logger.info("Info")
logger.warn("Warn")
logger.error("Error")
}
}
logback 적용 후 로그 출력
build.gradle.kts에 logback 추가
- build.gradle.kts
implementation("org.springframework.boot:spring-boot-starter-web")
or
implementation("org.springframework.boot:spring-boot-starter-logging")
src > main > resources > logback-spring.xml 파일 생성
- logback-spring.xml 코드 스니펫
<?xml version="1.0" encoding="UTF-8"?>
<configuration sacn="true" scanPeriod="60 seconds">
<!-- 60초마다 설정 파일의 변경을 스캔 -->
<springProfile name="sophie">
<property resource="logback-sophie.properties"/>
</springProfile>
<property name="LOG_PATH" value="${logPath}"/>
<property name="CONSOLE_LOG_PATTERN"
value="%d{MM-dd HH:mm:ss.SSS} %highlight(%-5level) %magenta(%-4relative) --- [ %thread{10}] [%logger{36}]: %msg%n"/>
<!--로그 패턴 정의-->
<property name="FILE_NAME" value="log-test-logs"/>
<!--상수 값 정의-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--FILE 이라는 이름의 로그 형태 정의, class - 특정 시간 또는 크기를 기준으로 로그 파일을 생성 -->
<!--error 레벨만 필터링 다른 레벨은 무시-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--생성할 로그 파일 경로 + 이름-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<!--파일 생성 정책 - 시간 기준 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--파일 생성 정책 - 시간 기준 -->
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>7</maxHistory>
<!--파일 최대 보관 기간 (90일) -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 크기별 로그 파일 생성 -->
<maxFileSize>10MB</maxFileSize>
<!-- logback-sophie.properties 에 정의한 최대 maxFileSize(10Mb) 만큼 마다 로그파일을 생성-->
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--CONSOLE 이라는 이름의 로그 형태 정의, class - 콘솔에 로그를 찍음-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--출력할 로그 인코더 설정 (PatternLayoutEncoder 는 default 설정이라 생략가능) -->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!--위의 property 로 정의한 콘솔 로그 패턴으로 출력-->
</encoder>
</appender>
<springProfile name="sophie">
<root level="ERROR">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
</configuration>
log4j2 적용 후 로그 출력
build.gradle.kts에 log4j2추가
- build.gradle.kts
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-log4j2")
modules {
module("org.springframework.boot:spring-boot-starter-logging") {
replacedBy("org.springframework.boot:spring-boot-starter-log4j2")
}
}
src > main > resources > log4j2.xml 파일 생성
- log4j2.xml 코드 스니펫
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<File name="File" fileName="/Users/greej/Desktop/logs/log4j2.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</File>
<Console name="Console">
<PatternLayout disableAnsi="false" pattern="%d${LOG_DATEFORMAT_PATTERN} %highlight${LOG_LEVEL_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Root>
<AppenderRef ref="File" level="error"/>
<AppenderRef ref="Console" level="error"/>
</Root>
</Loggers>
</Configuration>
'Back-end Skill > Springboot' 카테고리의 다른 글
[SpringSecurity] 쿼리낭비하지않는 코드: @AuthenticationPrincipal 쓰지않으면서 (0) | 2022.10.24 |
---|---|
[Springboot] 데이터 인자를 넘겨받는 각기 어노테이션 : 목적으로 다르게 효율적으로 쓰일 수 있는 방법들 (0) | 2022.10.24 |
Hibernate JPA 사용할 때 주의해야할 점. 원리를 모르면 그냥 쓰지마세요 1편 (9) | 2022.10.05 |
면접 스터디 2주차 자바와 스프링 프레임워크 (0) | 2022.02.15 |
스프링 MVC 정리본 1 (0) | 2022.02.12 |