여러가지 logging 라이브러리가 있는데 Spring Boot 2.0에서는 사진과 같이
Java Util Logging, Log4j 2, Logback 을 기본적으로 사용할 수 있다.
다른 로깅 라이브러리로 갈아타기 편하기 위해 Facade 패턴을 적용한 Slf4j를 사용하기 위해 lombok을 디펜던시에 추가해야한다.
Lombok 이 제공하는 @Slf4j 어노테이션을 적용하면 log.debug() 만으로 쉽게 로그를 확인할 수 있다.
Spring Boot 에서는 logback 이 기본 로깅 프레임워크로, 의존하고 있는 slf4j api 와 bridge 모듈을 함께 포함하고 있어 로그 처리 관련 모듈을 추가하지 않아도 된다.
Springboot 에는 기본적으로 logback 이 포함되어 있습니다. 따라서 Springboot 의 *Application.java
파일의 main()
함수를 호출하여 실행할 떄, IDE의 console 창에 나타나는 내용이 그것입니다.
https://linkeverything.github.io/springboot/spring-logging/
logback 관련된 설정을 찾다보면 logback.xml vs logback-spring.xml을 보게 되는데
Web Application이 시작되고 나서 classpath 내의 logback.xml을 뒤져서 환경 설정을 적용한다.
이 때는 Spring이 구동되기 이전이라 application.properties 내에 존재하는 값들을 불러올 수 없다.
logback-spring.xml에서는 Spring이 구동된 후라 application.properties에 있는 값들을 불러올 수 있다.
Spring이나 일반 java 프로그램의 경우 logback.xml 파일을 resources 디렉터리에 만들어서 참조하지만 Spring Boot의 경우에는 아래 3가지 중 한 가지 방법을 선택합니다.
Log level
TRACE < DEBUG < INFO < WARN < ERROR
https://yjh5369.tistory.com/entry/스프링부트-Spring-Boot-로그-설정-Logback
https://perfectacle.github.io/2018/07/22/spring-boot-2-log/
https://goddaehee.tistory.com/206?category=367461
https://programmer93.tistory.com/46
[ 로깅 패턴 ]
%-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자) (INFO, ERROR, DEBUG , 기타 등등이다.)
%d{날짜 형식 포맷} : 로그 기록시간 %d{yyyy-MM-dd HH:mm:ss} 을 사용하면 된다.
%thread : 현재 Thread 명
%F : 로깅을 발생시킨 파일 명
%M : 로깅을 발생시킨 메소드 명
%logger{length} : Logger name을 축약할 수 있다. length는 최대 자릿수이다 (0 = 무제한)
%line : 로깅이 발생된 라인 넘버%msg : - 로그 메시지
%n : 줄바꿈(new line)
이 외에도 여러 가지가 있다. ( http://logback.qos.ch/manual/layouts.html )
logback-spring.xml 색깔 적용 예시
<!-- 이 속성 안 쓸거임 -->
// <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){green} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
// <property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-default}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %green(%-5level) %logger{35} %cyan(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
// %green(%-5level) %logger{35} %cyan(%logger{15}) 요런 식으로 색깔을 줄 수 있다.
%highlight
를 이용하여 로그 레벨에 따른 색을 줄수 있다.%black
, %red
, %green
, %yellow
, %blue
, %magenta
, %cyan
, %white
, %gray
, %boldRed
, %boldGreen
, %boldYellow
, %boldBlue
, %boldMagenta
, %boldCyan
, %boldWhite
를 이용 할 수도 있다.%highlight([%-5level])
이와 같이 사용 가능하다.While Unix-based operating systems such as Linux and Mac OS X support ANSI color codes by default, on a Windows console, everything will be sadly monochromatic.
Windows can obtain ANSI colors through a library called JANSI.
We should pay attention to the possible class loading drawbacks, though.
We must import and explicitly activate it in the configuration as follows:
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<!-- more stuff -->
</configuration>
https://www.baeldung.com/spring-boot-logging
https://oingdaddy.tistory.com/257
https://hue9010.github.io/etc/logback-설정하기/
https://hermeslog.tistory.com/451
https://congsong.tistory.com/23
spyLogDelegatorName does not allow to valid 뭐시기
나 같은 경우, log4jdbc.log4j2.properties 파일에 띄어쓰기가 적용되어서 에러가 터졌다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
https://hermeslog.tistory.com/454?category=302344
<?xml version="1.0" encoding="UTF-8"?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
<!--로그 파일 저장 위치 -->
<springProfile name="dev">
<property name="LOGS_PATH" value="./logs" />
</springProfile>
<!-- 이 속성 안 쓸거임 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){green} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-default}" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %green(%-5level) %logger{35} %cyan(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_PATH}/logback.log</file>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level%logger{35} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGS_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>5MB</maxFileSize>
<!-- kb, mb, gb -->
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<logger name="net.lunalabs.central" level="INFO">
<appender-ref ref="DAILY_ROLLING_FILE_APPENDER" />
</logger>
<!-- log4jdbc 옵션 설정 -->
<logger name="jdbc" level="OFF" /> <!-- 커넥션 open close 이벤트를 로그로 남긴다. -->
<logger name="jdbc.connection" level="OFF" /> <!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
<logger name="jdbc.sqlonly" level="OFF" /> <!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
<logger name="jdbc.sqltiming" level="DEBUG" /> <!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
<logger name="jdbc.audit" level="OFF" /> <!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
<logger name="jdbc.resultset" level="OFF" /> <!-- SQL 결과 조회된 데이터의 table을 로그로 남긴다. -->
<logger name="jdbc.resultsettable" level="OFF" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
https://exhibitlove.tistory.com/302
Level TRACE - DEBUG - INFO - WARN - ERROR 순으로 오른쪽으로 갈수록 높은레벨. 출력 레벨 이상의 로그만 출력한다.
Appendar
이벤트마다 로그를 기록하는 기능을 처리하는 객체. 로그의 출력위치, 출력 형식등을 설정한다. logback-core모듈에는 3가지 기본 Appender이 있다.