졸업 프로젝트 기능중에 사용자 로그를 분석하여 방문자의 나이대와 성별 통계를 그래프화 해서 보여주는 기능의 개발을 내가 맡게 되었다.
그래서 여태까지 로그 기능을 한번도 써본적이 없었는데 이 기회로 공부할 수 있게 되었다.
내가 개발한 기능에 대해 간략히 설명하자면
- 사용자가 특정 페이지에 방문한다.
- 사용자 아이디(u_id)와 방문한 페이지 번호(a_id)를 로그에 남긴다.
- 이를 하루 단위로 로그파일로 저장한다.
- 매일 생성된 파일을 자정마다 읽어들여 db table에 업데이트한다.
Logback
은 log4j
를 발전시킨 logging framework로 spring boot
는 spring-boot-starter-web > spring-boot-starter-logging에 logback 구현체가 포함되어 있다.
그래서 의존성을 따로 추가하지 않아도 logback이 기본 로깅 구현체로 자동 적용된다.
이렇게 적용된 로깅 구현체는 SLF4J
(Simple Logging Framework for JAVA : interface)와 compile시에 바인딩된다.
우선 Logger 객체를 생성하여준다.
Logger logger = LoggerFactory.getLogger(this.getClass());
나는 Service단에 printLog
라는 함수를 만들고 이 함수를 Controller에서 호출했다.
//Service - 로그 찍는 메서드
public void printLog (Long u_id, Long a_id) {
logger.info("u_id: "+u_id+" a_id: "+a_id);
//log level 을 info로 지정
}
//Controller
alcoholService.printLog(u_id, a_id);
로그 레벨은 5가지로 구성되며 오른쪽으로 갈수록 단계가 높아진다.
Trace
➡Debug
➡Info
➡Warn
➡Error
나는 위에서 로그 레벨을 info로 설정하였기 때문에 콘솔에 출력될때 ㅇㅇ 처럼 출력된다.
그렇다면 콘솔이 아니라 로그를 파일에 저장하는건 어떻게 할까?
logback에 대한 여러 설정을 변경할 수 있게 resources/logback-spring.xml
파일을 만든다.
<configuration scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%-5level] - %msg%n</Pattern>
</layout>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- Rolling 정책 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logs/logback-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 7일까지 보관 -->
<maxHistory>7</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<logger name="graduation.alcoholic.web.board.alcohol" level="INFO">
<appender-ref ref="ROLLING" />
</logger>
</configuration>
appender
appender란 로그를 작성하는 일을 맡고 있는 객체로 이를 상속받는 객체들은
ConsoleAppender
,FileAppender
,RollingFileAppender
가 있다. (어디에다가 작성할지 결정함!)
- ConsoleAppender : 콘솔에 로그를 출력
- FileAppender : 로그를 파일에 저장
- RollingFileAppender : FileAppender를 상속하여 지정한 패턴에 따라 다른 파일에 로그가 저장될 수 있게함
Pattern
출력할 로그의 패턴을 정한다.
- %-5level: 로그 레벨, -5는 출력의 고정폭 값(5글자)
- %msg: - 로그 메시지
fileNamePattern
파일을 저장할 위치와 이름의 패턴을 정한다.
- %d: 로그 기록시간 출력
maxHistory
보관할 최대 파일 수. 7로 설정하고 rollover는 일간이므로 7일이 지난파일들은 삭제됨
root/logger
실제 로깅을 수행하는 객체로 root는 최대 하나를 가질 수 있고 logger는 여러개를 가질 수 있으며 root를 상속받는다.
위와같이 설정을 하면 logs폴더 안에 설정한 이름 규칙에 맞춰 하루 단위로 로그파일들이 생성된다.
파일내에는 이렇게 로그가 찍혀있다. 위에서 작성한 printLog()
의 내용처럼 INFO
level에 u_id
와 a_id
가 적혀있다.
이렇게 해서 logback으로 로그파일을 생성하는 방법을 얕게나마 알아보았다.
logback-spring.xml을 작성하려다 보니 logback의 구조에 대해 꽤나 자세히 찾아보게 되었는데 내용이 생각보다 방대했다. 그러나 공식 문서가 잘 돼있어서 괜찮았다.
앞으로 로그를 찍을 일이 많을텐데 그 때까지 까먹지 않는것이 목표이다😀
잘 보고 갑니다!