[Java] 로그 라이브러리(log4j)


Development note/Java  2019. 8. 26. 23:28

안녕하세요. 명월입니다.


이 글은 Java에서 사용하는 로그 라이브러리(log4j)에 대한 글입니다.


이 전에 제가 C#에서 사용하는 log4net에 대해 소개한 적이 있습니다.

링크 - [C#] 로그 라이브러리(log4net)


사실 이 log4net과 log4j는 같은 라이브러리인데 사용하는 언어가 C#이냐 Java이냐의 차이만 있을 뿐입니다. 전의 글에서도 로그에 대해 간략하게 설명했었는데 정리해서 다시 설명하겠습니다.

로그라는 것은 프로그램을 개발하는 데 있어서 데이터 추적과 호출된 클래스와 함수등을 조사하기 위해 사용하는 라이브러리입니다.


보통 개발을 할 때는 IDE툴을 이용해서 디버깅을 하면 데이터 추적을 할 수 있지만 개발이 끝나고 나서 프로그램이 컴파일 되고 Production에 릴리즈가 되면 데이터 추적하기가 쉽지 않습니다.

그러나 완벽한 프로그램이라면 문제가 없겠지만 인간이 만든 프로그램이기 때문에 버그가 발생하고 그 버그로 인해 잘못된 연산을 하거나 에러가 발생합니다. 에러가 발생할 때는 데이터를 추적할 수 있어야 하는데..

그 때, 추적을 할 수 있는 여러 방법 중에 가장 간편한 방법 중에 하나로 로그를 남기고 추적하는 방법입니다.


그 외에 로그는 꼭 에러 추적만이 아닌 여러 행동 패턴을 남기고, 또는 유저의 행동등을 추적하여 여러 통계자료로도 활용할 수 있습니다.


그럼 Java에서 Log4j를 사용하기 위해서는 maven를 통해서 log4j를 다운 받아야 합니다.

import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory;

public class Main {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    // log4j.xml 파일 설정
    System.setProperty(XmlConfigurationFactory.CONFIGURATION_FILE_PROPERTY,"d:\\log4j.xml");
    Logger logger = (Logger) LogManager.getLogger(Main.class);
    
    // 로그 레벨 순위 입니다.
    logger.fatal("fatal log");
    logger.error("error log");
    logger.warn("warn log");
    logger.info("info log");
    logger.debug("debug log");
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
  <appenders>
    <!-- 콘솔 로그 설정 -->
    <Console name="console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d [%t] %-5p %c - %m%n" />
    </Console>
    <!-- 파일 로그 설정 -->
    <RollingFile name="file" fileName="d:\logs\all.log" filePattern="./logs/all.%i.%d{yyyy-MM-dd}.log">
      <PatternLayout pattern="%d [%t] %-5p %c - %m%n" />
      <Policies>
        <SizeBasedTriggeringPolicy size="10MB" />
      </Policies>
      <DefaultRolloverStrategy max="1000" fileIndex="min" />
    </RollingFile>
  </appenders>
  <!-- 로그 레벨 설정 -->
  <loggers>
    <root level="ALL">
      <appender-ref ref="console" />
      <appender-ref ref="file" />
    </root>
  </loggers>
</configuration>

log4j의 경우는 log4net과 다르게 소스상에서 설정은 없는 것 같습니다. 원래는 있는데 제가 찾지를 못하는 것일 수도 있습니다.

링크 - https://logging.apache.org/log4j/2.0/manual/api.html


저의 경우는 property설정으로 log4j파일을 지정했습니다만, 사실 웹 프로젝트라면 resource 폴더에 넣고 별도의 설정이 없이도 xml를 찾아 읽을 것 입니다.

그러니 log4j.xml 설정을 하기 위해 resource 경로 설정에 대해 신경 쓰지 않아도 될 것 같습니다.


그리고 xml 설정이 아니라 json 설정으로도 되는 듯 싶습니다. 그러나 개인적으로 환경설정 파일은 xml이 낫지 않을 까 싶네요. json은 편하긴 하지만 가독성이 좀 떨어져서...


여기까지 Java에서 사용하는 로그 라이브러리(log4j)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.