-
[Spring] Logging / Logging Framework / Log Level / Logback / Log AppenderBackend/Spring 2022. 7. 31. 13:35728x90
Logging 이란?
- 시스템을 작동할 때 시스템의 작동 상태의 기록과 보존, 이용자의 습성 조사 및 시스템 동작의 분석 등을 하기 위해 작동 중의 각종 정보를 기록해두는 것
- 로그 시스템의 사용에 관계된 일련의 사건을 시간의 경과에 따라 기록하는 것
- system.out : 불편함, 여러번 로그를 찍으면 오버헤드가 발생할 수 있어 성능저하 발생 -> 사용안함!
Logging Framework
- java.util.logging : 거의 안씀
- apache commons logging
- log4j : 성능상 문제 -> log4j2 탄생
- logback : 제일 많이 사용
- slf4j : 로깅 프레임워크들을 여러개 사용할 수 있게 해주는 인터페이스
SLF4J (Simple Logging Facade For Java)
여러 logging framework를 추상화해놓은 프레임워크
facade pattern을 이용한 로깅 프레임워크
- facade pattern : 많은 서브시스템을 거대한 클래스로 만들어 감싸서 편리한 인터페이스를 제공하며 pacade만 보고 메소드를 호출하면 실제로 어떤 프레임워크를 써서 작동되는지 모르게 한다.
좋은 로깅 프레임워크가 나올 때마다 매번 코드를 변경하면 좋지 않기 때문에 이를 사용하면 바인딩만 바꿔서 설정만 바꿔서 같은 코드로 사용하게 해줌
즉, 다양한 로깅 프레임워크를 바인딩 모듈을 통해 처리해서 지원!
- 바인딩 모듈 : 로깅 프레임워크를 연결하는 역할
- 개발자는 SLF4J를 이용해서 로그를 남기고 실제 프레임워크 연결은 바인딩이 해결
Log Level
어떤 상황에 어떤 환경 별로 로그를 어느정도까지 남길지 결정
- trace
- debug
- info
- warn
- error
예를 들어 설정을 warn으로 했다면 warnning보다 더 심각한 수준의 로그 레벨(warn, error)만 로그가 남게됨. 즉 trace, debug, info 레벨의 로그는 나오지 않음
만약 시스템의 모든 로그를 보겠다고 하면 trace로 설정
로그를 꺼버리고 싶다면 off로 설정(로그를 남기는 것 자체도 시스템 성능에 영향을 미치기 때문)
Logger
로그를 기록하는 행위
이름 기반으로 생성됨
Logback 설정
로그에 관련된 설정은 로깅 프레임워크 설정에 따르게 되는데 이때 logback설정을 통해서 로깅 설정이 가능
logback 설정 파일 찾는 순서
- logback-test.xml 파일을 찾음
- 없다면 logback.groovy를 찾음
- 없다면 logback.xml을 찾음
- 모두 없다면 기본 설정 전략을 따름 BasicConfiguration
logback-test.xml을 제일 먼저 찾는 이유?
- test라는 폴더에 테스트 코드를 작성하는데 자바 폴더의 같은 레벨로 resources라는 폴더가 있는데 이 밑에 logback-test.xml을 넣음
- 테스트에서는 메인의 클래스를 임포트해서 쓸 수 있고 리소스도 쓸 수 있기 때문에 충돌이 날 수 있어 먼저 적용되는 것
- 실제 배포 시에는 logback-test가 없기 때문에 logback.groovy, logback.xml을 사용하게 되는 것
<configuration> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"></property> <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <logger name="org.prgrms.kdt" level="info" additivity="false"> <appender-ref ref="ROLLING_FILE" /> </logger> <root level="warn"> <appender-ref ref="STDOUT" /> </root> </configuration>
Log Appender
ConsoleAppender, FileAppender, RollingFileAppender 3가지가 존재
1. ConsoleAppender
콘솔에 로그를 찍는 것
<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{HH:mm:ss.SSS}){cyan} [%thread] %clr(%-5level) %logger{36} - %msg%n"></property> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender>
2. FileAppender
로그를 파일에 저장
기본적으로 로그가 덧붙여서 저장되기 때문에 append false를 통해 새로 작성할 수 있음
만약 로그마다 다른 파일에 저장하고 싶다면?
- TimeStamp를 정의한 뒤 파일을 time마다 저장하도록 함
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"></property> <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"></timestamp> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs/kdt_${bySecond}.log</file> <append>false</append> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender>
3. RollingFileAppender
이때 rollingPolicy와 triggerPolicy가 정의되어야 함
- rollingPolicy : 파일을 어떻게 만들 것인지 정의
- triggerPolicy: 언제 로깅을 남길 것인지 정의
TimeBasedRollingPolicy를 사용할 경우 두 가지를 한번에 정의
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"></property> <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender>
728x90'Backend > Spring' 카테고리의 다른 글
[Spring Boot] Spring Boot에서 Thymeleaf 사용하기 (0) 2022.08.12 [Spring Error] EmbeddedDatabase 사용 시 java.lang.RuntimeException: mysql start failed with error 해결 (0) 2022.08.05 [Spring] AppConfig / IoC / DI (0) 2022.05.09 [Spring] SOLID (0) 2022.05.09 [Spring] 스프링/스프링컨테이너/스프링빈 이란? (0) 2022.05.09