ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Logging
    Java/Spring 2018. 8. 27. 16:53
    반응형

    logging은 과정을 기록하는 것이다.

    DB만으로는 추측이 어렵기 때문에 로깅을 이용한다.

    ex) 조회수


    Spring Framework는 Commons-Logging을 사용한다. - Spring 4이하 버전까지

    Spring5부터는 spring-jcl을 사용한다.


    Commons-logging은 Cpu와 Ram, Disk ( System Resource )를 많이 잡아 먹기때문에 Log4J 또는 Logback으로 변경이 필요하다.

    Log4j 또는 Logback 라이브러리가 필요하다.


    Log4j와 logback은 commons-logging을 대신 사용하기 위해 필요하다.


    없으면 안찍히거나 2번 찍히게 된다.


    pom.xml에 Dependency를 추가한다.


    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.25</version>
    </dependency>


    slf4j는 logback과 log4j 클래스를 사용하기 위한 인터페이스다.

    dependency를 추가할때 beta, alpha 버전은 안전하지 않으므로 정식버전만 진행한다.


    spring-jcl은 System Resource를 많이 잡이 사용해서 제외해야 한다.

    pom.xml에서 Dependency Hierarchy에서 spring-jcl을 Exluce Maven Artifact로 제외시킨다.


    제외하게 되면 spring-jcl이나 commons-logging 라이브러리는 사용되지 않는다.







    tailme를 설치하고서 log 파일을 드로그해서 tailme에 끌어서 사용한다.

    tailme는 여러개 사용 가능하고 log파일이 변할때마다 실시간으로 log파일의 변화를 볼  수 있다.

    encoding이 utf-8이 지원을 안하는 것 같아서 한글 정보가 있을 때는 따로 편집해서 봐야한다.









    log의 level은 5까지 있다.



    src/main/resources에 logback.xml 파일을 만든다.


    <configuration>

        <appender name="STDOUT"
            class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>▶ %d{HH:mm:ss.SSS} %-5level %logger{0}.%method:%line -
                    %msg%n
                </pattern>
            </encoder>
        </appender>
        
        <appender name="STDOUT_File"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>D:/logs/STDOUT_File.log</file>
            <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 날짜가 바뀌면
                fileNamePattern에 따라 log file을 바꿔줌 -->
                <!-- daily rollover -->
                <fileNamePattern>D:/logs/STDOUT_File.%d{yyyy-MM-dd}.log</fileNamePattern>
                <!-- keep 30 days' worth of history capped at 3GB total size -->
                <!-- <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap> 3GB초과시 예전파일부터 삭제 -->
            </rollingPolicy>
            <encoder>
                <pattern>▶ %d{HH:mm:ss.SSS} %-5level %logger{0}.%method:%line -
                    %msg%n
                </pattern>
            </encoder>
        </appender>

        <appender name="statistics"
            class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- File Appender -->
            <file>D:/logs/statistics.log</file>
            <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 날짜가 바뀌면
                fileNamePattern에 따라 log file을 바꿔줌 -->
                <!-- daily rollover -->
                <fileNamePattern>D:/logs/statistics.%d{yyyy-MM-dd}.log</fileNamePattern>
                <!-- keep 30 days' worth of history capped at 3GB total size -->
                <!-- <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap> 3GB초과시 예전파일부터 삭제 -->
            </rollingPolicy>
            <encoder>
                <pattern>Statistics : %d{HH:mm:ss.SSS}, %msg%n
                </pattern>
            </encoder>
        </appender>

        <appender name="param"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>D:/logs/param.log</file>
            <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- daily rollover -->
                <fileNamePattern>D:/logs/param.%d{yyyy-MM-dd}.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <!-- 어떤 클래스에, 메소드의 라인 -->
                <pattern>Param : %d{HH:mm:ss.SSS} $logger.%method:%line %msg%n
                </pattern>
            </encoder>
        </appender>

        <logger level="debug" name="com.ktds">
            <appender-ref ref="param" />
        </logger>

        <!-- info까지만 찍힌다. -->
        <logger level="info" name="list.Statistics">
            <appender-ref ref="statistics" />
        </logger>

        <logger level="debug" name="org.springframework">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="STDOUT_File" />
        </logger>

        <!-- debug까지, 에러발생시 debug 활용 -->
        <!-- <root level="debug"> <appender-ref ref="STDOUT" /> </root> -->
    </configuration>


    pattern대로 log가 찍힌다.

    appender는 class가 담당한다.


    level을 Info로 쓰다가 문제가 발생시 Debug로 바꿔서 문제를 확인한다.

    log같은 경우 콘솔에 일일히 확인하기 어렵기 때문에 파일을 생성해서 tailme와 같은 툴로 확인한다.


    name에는 패키지도 지정가능하다.

    root를 찍으면 모든 log가 한번에 출력한다.

    root를 없애려면 logger tag를 이용한다.


    log pattern에는
    %msg - 로깅내용

    %n - 개행
    % -5level - 로깅 레벨(error, warn, info, debug, trace)출력, 고정폭, 로깅레벨이 info일 경우 빈칸 하나 추가한다.

    %d{yyyy-MM-dd HH;mm:ss.SSS}} - 로깅하고 있는 현재 시간, 시.분.초.밀리초

    %logger - 패키지 포함 클래스 정보

    %logger{0} - 패키지를 제외한 클래스 이름만 출력

    %method - 로깅하고 있는 클래스의 메소드

    %line - 로깅하고 있는 클래스 소스의 line


    level이 debug면 parameter의 전달된 정보 log를 볼 수 있다.

    Error가 없으면 debug를 info로 바꾼다.



    반응형

    'Java > Spring' 카테고리의 다른 글

    Error - configuring application listener of class org.springframework.web.context.ContextLoaderListener  (0) 2018.08.29
    Transaction / AOP  (0) 2018.08.27
    Static Resources  (0) 2018.08.24
    Interceptor  (0) 2018.08.24
    bean config 설정 분리  (0) 2018.08.24

    댓글

Designed by Tistory.