해당 블로그를 참조하였습니다.
안녕하세요
저는 프로젝트에서 log를 찍을 때 log4j를 사용했었는데 성능 및 기능상의 이유로 logback으로 변경하고,
log를 C드라이브 아래 or 서버(본인은 ec2)에 파일로 저장하도록 하겠습니다.
log4j를 사용할 때는 commons.logging 라이브러리(JCL, Jakarta Commons Logging) 을 사용하는데요
스프링의 로그는 JCL에 의존하여 로그가 찍히게 되는 것 입니다.
pom.xml에
spring-context 라이브러리를 추가하면 spring-context안에 commons-logging 라이브러리도 같이 존재합니다.
logback 라이브러리를 사용하려면 SLF4J가 필요합니다.(SLF4J : JCL과 Log4J를 이어주는 역할)
라이브러리들 안에 있는 commons-logging을 제외하도록 하겠습니다.
그리고 logback을 하기위한 dependency도 추가하도록 하겠습니다.
<!-- pom.xml -->
<properties>
<jcloverslf4j.version>1.7.6</jcloverslf4j.version>
<logback.version>1.1.1</logback.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.24.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId> <!-- JCL 제외 -->
<artifactId>spring-context</artifactId>
<version>4.3.24.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcloverslf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
exclusion태그로 JCL을 제외시키면 기존에 로그를 남기는 코드는 에러를 발생시키는데
jcl-over-slf4j 라이브러리가 중간의 매개체가 되어서
실제로는 logback-classic 라이브러리가 로그를 남기게 됩니다.
이제 src/main/resources 위치에 logback.xml을 생성하여 로그를 남길 수 있도록 작성하겠습니다.
<!-- src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
[Layout]
%m : 로그내용이 출력
%p : trace > debug > info > warn > error 등의 priority 출력
%r : 어플리케이션이 시작되어 로깅이벤트가 발생하는 시점까지의 경과시간을 밀리세컨드로 출력
%c : 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%n : 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다
%d : 로깅이벤트가 일어나 날짜 출력 ( 프로그램의 실행속도를 느리게 한다.)
예) %d{HH:mm:ss} 또는 %d{dd MMMM yyyy HH:mm:ss}
%C : 호출자의 클래스명 출력
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%M : 로깅이 발생한 method 이름을 나타냅니다.
%F : 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l : 로깅이 발생한 caller의 정보를 나타냅니다
%L : 로깅이 발생한 caller의 라인수를 나타냅니다
%x : 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X : 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.
%% : % 표시를 출력하기 위해 사용한다.
%t : 로그이벤트가 발생된 쓰레드의 이름을 출력합니다
-->
<configuration scan="true" scanPeriod="30 seconds">
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>/edu-project/logs/jys/logback-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<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>
<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>
<!-- Loggers -->
<logger name="org.apache.catalina" level="ERROR">
</logger>
<logger name="org.apache.commons" level="ERROR">
</logger>
<logger name="org.springframework" level="DEBUG" >
</logger>
<logger name="java.sql" level="DEBUG">
</logger>
<logger name="org.mybatis.spring" level="DEBUG">
</logger>
<root level="DEBUG">
<appender-ref ref="ROLLING"/>
<appender-ref ref="STDOUT" />
</root>
</configuration>
해당 코드에 <fileNamePattern>을 보시면
<fileNamePattern>/edu-project/logs/jys/logback-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
다음과 같이 '/'로 경로를 표현하는데 이는 지금 저는 ec2서버로 파일을 저장할 것이기 때문에 '/'로 표현했으며
로컬 C드라이브 밑에 저장하고 싶다면
<FileNamePattern>C:\test\test.%i.log.zip</FileNamePattern>
'\'로 작성해야 합니다.
이는 리눅스와 윈도우는 각각 '/'와 '\'를 사용하기 때문입니다.
그리고 특정 라이브러리에 commons-logging 라이브러리가 포함되어 있을 수 있기 때문에
라이브러리를 확인하여 만약 commons-logging 라이브러리가 있다면
<exclusion>로 commons-logging 라이브러리를 제외시켜야 정상 작동 된다는 것을
알고계시면 좋을 것 같습니다.