코딩마을방범대
Log - (1) Log4j 본문
728x90
Log4j란?
- JAVA를 사용하여 Log를 남기는 도구
- 자바 기반의 로깅 유틸리티로 Apache에서 만든 오픈소스 라이브러리
- log4j의 설정은 log4j.properties / log4j.xml 로 설정
Log
컴퓨터가 언제, 무슨 일을, 어떻게 했는지 남겨 놓은 기록
Log4j 구성 요소
요소 | 설명 |
Logger | 출력할 메시지를 Appender에 전달 |
Appender | 전달된 로그를 어디에 출력할지 결정(콘솔 출력, 파일 기록, DB 저장 등) |
Layout | 로그를 어떤 형식으로 출력할지 결정 |
Appender
- 로그를 출력할 위치, 출력 형식 등을 지정
- Appender태그는 Logger태그들보다 위에 있어야 함
요소 | 설명 |
ConsoleAppender | org.apache.log4j.ConsoleAppender 콘솔에 로그 메시지를 출력 |
FilerAppender | org.apache.log4j.FilerAppender 로그 메시지를 지정된 파일에 기록 |
RollingFileAppender | org.apache.log4j.RollingFileAppender 파일 크기가 일정 수준 이상이 되면 기존 파일을 백업파일로 두고 처음부터 다시 기록 (DatePattern 사용 불가) |
DailyRollingFilerAppender | org.apache.log4j.Daily.Rolling.File.Appender 일정 기간 단위로 로그 파일을 생성하고 기록 (Max 사용 불가) |
Log4j 사용하기
(1) properties를 이용한 설정 방법
1. build.gradle에 dependency 추가
// https://mvnrepository.com/artifact/log4j/log4j
implementation group: 'log4j', name: 'log4j', version: '1.2.17'
2. properties 설정 (log4j.properties)
# 1: Logger
# 로거 레벨, 객체명, 객체명을 입력
log4j.rootLogger=DEBUG, consoleAppender, fileAppender, sql
# 2: rootLogger에서 정의한 객체에 타입과 기능을 정의 (Appender)
# consoleAppender = 콘솔에 출력해주는 객체라고 정의
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold=All
# 3: Layout
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=[%d] [%-5p] %c %x - %m%n
# 4
# log4j.appender.fileAppender는 파일로 저장을 의미
# org.apache.log4j.RollingFileAppender는 하루에 한 번씩 파일을 생성한다는 의미
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
# 파일의 위치와 파일의 네이밍을 설정
log4j.appender.fileAppender.File=C:/Users/dbkim/Desktop/TASK/log/log.log
# 5
log4j.appender.fileAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.fileAppender.Threshold=All
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
# 하루가 지난 파일은 log4j.log에서 log4j.2022-09-06의 형태로 바꾸겠다는 의미
log4j.appender.fileAppender.layout.ConversionPattern=[%d] [%-5p] [%13F\:%L] - %m%n
(2) xml을 이용한 설정 방법
1. build.gradle dependency 추가
// https://mvnrepository.com/artifact/log4j/log4j
implementation group: 'log4j', name: 'log4j', version: '1.2.17'
2. xml 파일 설정 (log4j.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration
xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 콘솔 로그 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c{5}] %m [%X{userId}]%n" />
</layout>
</appender>
<!-- 날짜별 로그 파일 생성(AUTH) -->
<appender name="authLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="/Users/dbkim/Desktop/TASK/LOG/auth.log"/>
<param name="Append" value="true"/>
<!-- param name="MaxFileSize" value="100MB"/ -->
<!-- param name="MaxBackupIndex" value="2"></param -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%C{10}] %m [%X{userId}]%n" />
</layout>
</appender>
<!-- 날짜별 로그 파일 생성(INFO) -->
<appender name="infoLog" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="/Users/dbkim/Desktop/TASK/LOG/info.log"/>
<param name="Append" value="true"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%C{10}] %m [%X{userId}]%n" />
</layout>
</appender>
<!-- 날짜별 로그 파일 생성(에러만) -->
<appender name="errFile" class="org.apache.log4j.DailyRollingFileAppender">
<!-- 해당 파일이 출력하는 로그 레벨을 설정할 수 있음 -->
<param name="Threshold" value="ERROR"/>
<param name="File" value="/LOG/INFO/error.log"/>
<param name="Append" value="true"/>
<!-- param name="MaxFileSize" value="100MB"/ -->
<!-- param name="MaxBackupIndex" value="2"></param -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p [%C{1}] %m [%X{userId}]%n" />
</layout>
</appender>
<!-- 특정 패키지 출력 설정 -->
<logger name="com.fnsvalue.task10_logsave.controller.info">
<level value="DEBUG"/>
<appender-ref ref="infoLog" />
</logger>
<logger name="com.fnsvalue.task10_logsave.controller.auth">
<appender-ref ref="authLog" />
</logger>
<!-- 기본 출력 설정 -->
<root>
<level value="INFO" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
코드 해석
1. 파일 생성 설정을 따로따로 설정하여 사용할 수 있음
<!-- infoLog라는 이름으로 설정해놓은 후 나중에 사용할 때 infoLog로 가져와 사용 -->
<appender name="infoLog" class="org.apache.log4j.DailyRollingFileAppender">
2. append 옵션 설정
- true(기본값): 파일 끝에 추가하는 것
- false: 각각의 프로그램이 시작할때 파일에 덮어씌움
<param name="Append" value="true"/>
3. 발생 레벨 별로 파일을 따로 만들 수 있음
<param name="Threshold" value="ERROR"/>
4. 날짜 별로 로그 파일 생성 시 이름에 날짜 추가
지정된 주기마다 로그파일 교체(roll)
- '.'yyyy-MM: 매달의 첫날
- '.'yyyy-ww: 매주의 첫날
- '.'yyyy-MM-dd: 매일 자정
- '.'yyyy-MM-dd-a: 매일 자정과 정오
- '.'yyyy-MM-dd-HH: 시간마다(시간이 시작할때)
- '.'yyyy-MM-dd-HH-mm: 분마다(분이 시작할때)
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
5. PatternLayout 설정
- 각각의 로그메세지의 형식을 나타내는 방법(포함하는 정보)
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%C{10}] %m [%X{userId}]%n" />
</layout>
6. 최대 파일 크기, 갯수 설정
(DailyRollingAppender 에선 사용 불가)
- MaxFileSize: 지정한 크기에 도달하면 로그파일을 교체
- MaxBackupIndex: value값만큼의 갯수를 넘은 파일은 삭제(0: 백업파일을 만들지 않음)
<param name="MaxFileSize" value="100MB"/>
<param name="MaxBackupIndex" value="2"/>
🙌 현재 로거 레벨 확인하는 방법
logger.getEffectiveLevel() // ERROR
패키지 별로 레벨 설정하는 방법
1-1. resources/log4j.properties에 내용 추가
// log4j.logger.패키지경로 = 로그레벨
log4j.logger.com.logsave.controller.info=DEBUG
1-2. xml에 내용 추가
<logger name="com.logsave.controller.info">
<level value="DEBUG"/>
<appender-ref ref="infoLog"/>
</logger>
2. 클래스 파일 내 설정
private Logger logger = Logger.getLogger(Test.class);
...
logger.setLevel(Level.DEBUG)
날짜별 파일 저장 및 파일 개수에 제한을 두고싶다면 Logback 사용
참고사이트
[JAVA] Log4j의 정의와 설정-무사뎀벨레의 블로그
[log4j] 로그레벨 package 별로 설정하기-side impact
날짜별/특정 패키지별 logger 파일 생성 log4j.xml 추가 appender-개꼬 [: 개발하는 꼬바리]
[log4j] log4j 튜토리얼 번역-DEV용식
728x90
'💡 백엔드 > Java' 카테고리의 다른 글
JAVA로 파일 삭제 하기 (0) | 2023.05.27 |
---|---|
MyBatis의 샾(#{})과 달러(${})의 차이 (0) | 2023.05.27 |
Contoller의 오류 (0) | 2023.05.27 |
Java로 메일 가져오기 (0) | 2023.05.26 |
Date 비교 메소드 (0) | 2023.05.26 |