티스토리 뷰
Log4j : 자바기반의 로깅 유틸리티. Apache에서 만든 오픈소스 라이브러리
System.out.println()만 사용한다면
1) 운영시에 불필요한 로그가 계속 출력된다.
println이 운영에서도 남아 있다면 불필요한 로그로 리소그가 낭
비된다.
2) 모든 println을 삭제하면 에러가 발생했을 때, 해당 원인을 찾기가 어렵다.
println이 모두 삭제된 상태라면 원인을 찾을 수 없다.
3) 성능에 영향을 미친다.
1부터 100까지의 단순 출력이라면 단시간에 실행이 되여 성능에 큰 영향이 없지만
계산 과정 같은 로직을 출력하게 했다면 시간이 오래 걸리게 되고 성능에 영향을 미치게 된다.
Log4j는 위의 문제를 해결 할 수 있고
옵션 설정을 통해 선택적으로 로그를 남기거나 특정 파일에 로그를 생성하는 등 다양한 이점을 가지고 있다.
로그 레벨
로그레벨 | 설명 |
FATAL | 아주 심각한 에러가 발생한 상태를 나타낸다. |
ERROR | 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타낸다. |
WARN | 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메세지를 나타낸다. |
INFO | 어떠한 상태변경과 같은 정보성 메세지를 나타낸다. |
DEBUG | 개발 시 디버그 용도로 사용하는 메세지를 나타낸다. |
TRACE | 디버그 레벨이 너무 광범위한 것을 해결하기 위해 좀 더 상세한 이벤트를 나타낸다. |
구성요소
요소 | 설명 |
Logger | 출력할 메시지를 Appender에 전달한다. |
Appender | 전달된 로그를 어디에 출력할 지 결정한다. (콘솔 출력 파일 기록, DB 저장 등) |
Layout | 로그를 어떤 형식으로 출력할 지 결정한다. |
name
요소 | 설명 |
jdbc.sqlonly | SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. |
jdbc.sqltiming | SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. |
jdbc.audit | ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. |
jdbc.resultset | ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. |
class (org.apache.log4j.~)
요소 | 설명 |
ConsoleAppender | 콘솔에 로그 메시지를 출력한다. |
FilerAppender | 로그 메시지를 지정된 파일에 기록한다. |
RolingFileAppender | 파일 크기가 일정 수준 이상이 되면 기존 파일을 백업 파일로 두고 처음부터 다시 기록한다. |
DailyRolingFilerAppender | 일정 기간 단위로 로그 파일을 생성하고 기록한다. |
layout value
패턴 | 설명 |
%m | 로그 내용 출력 |
%p | debug, info, warn, error 등의 priority 출력 |
%r | 어플리케이션 시작 후 이벤트가 발생하는 시점까지의 경과시간. (밀리초 출력) |
%c | package 출력 |
%C | class명 출력 (성능에 영향 줌) |
%d | 이벤트 발생 날짜 출력 (성능에 영향 줌) |
%n | 개팽문자(\n) 출력 |
%M | 로깅이 발생한 method 이름 출력 (성능에 영향 줌) |
%F | 로깅이 발생한 프로그램 파일명 출력 (성능에 영향 줌) |
%I | 로깅이 발생한 caller 정보 출력 (성능에 영향 줌) |
%L | 로깅이 발생한 caller 라인수 출력 (성능에 영향 줌) |
%x | 로깅이 발생한 thread와 관련된 NDC 출력 |
%X | 로깅이 발생한 thread와 관련된 MDC 출력 |
% | % 출력 표시 |
%t | thread 이름 출력 |
additivity
Logger Name | Level | Appender | Additivity |
Root | DEBUG | Console | |
Vehicle | INFO | RolingFile | true |
Vehicle.Car | ERROR | Filer | false |
여기서 Additivity는 상위 Logger로부터의 상속 여부를 의미합니다. True(기본값)일 경우, 먼저 모든 상위 로거들의 설정값을 상속받아 현재 로거에 설정된 값을 재적용(덮어쓰기) 시키며, False로 설정하게 된다면 해당 로거는 상위 로거의 설정내용을 상속받지 않습니다.
즉, Vehicle의 경우 Root 로거로부터 DEBUG 레벨 설정을 상속받지만 현재 로거에 INFO 레벨이 적용되어 있기 때문에 최종적으로 INFO 레벨이 적용되며, Root 로거의 Console Appender와 Vehicle 로거의 RollingFile Appender 모두에게 로그 메시지를 전달하게 됩니다.
Vehicle.Car의 경우 Additivity 값이 false 이기 때문에 상위 로거인 Root, Vehicle 로거로 부터 설정을 상속받지 않아 최종적으로 ERROR 레벨 이상의 로그가 File Appender로 전달되게 됩니다.
만일 Logger 설정되지 않은 클래스명( ex – Vehicle.Airplane)이 입력되었을 경우, 상위 로거인 Vehicle의 설정내용으로 동일하게 적용됩니다.
출처: https://to-dy.tistory.com/20 [todyDev]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<!-- <param name="Target" value="System.out" /> -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p: [%c] - %m%n" />
</layout>
</appender>
<appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p %n%m%n"></param>
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.testboard.biz" additivity="false">
<level value="info" />
<appender-ref ref="console"></appender-ref>
</logger>
<!-- Query Loggers -->
<logger name="jdbc.sqlonly" additivity="false">
<level value="INFO"></level>
<appender-ref ref="console-infolog"></appender-ref>
</logger>
<logger name="jdbc.resultsettable" additivity="false">
<level value="INFO"></level>
<appender-ref ref="console"></appender-ref>
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="off" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
'줍줍 > 코딩하다 안거' 카테고리의 다른 글
mySQL LAST_INSERT_ID() (0) | 2019.06.17 |
---|---|
logback 설정 에러 (0) | 2019.06.06 |
오류와 예외 (0) | 2019.05.15 |
클래스 멤버와 인스턴스 멤버 (0) | 2018.12.30 |
Date와 Timestamp 차이 (0) | 2018.12.09 |
- Total
- Today
- Yesterday
- application context
- Controller
- XmlWebApplicationContext
- #java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent삭제
- afterCompletion
- postHandler
- JoinPoint
- 어노테이션
- setter 인젝션
- servlet context
- blocking
- ViewResolver
- handlermapping
- @Autowired
- preHandler
- 스프링 컨테이너
- 검색
- NoClassDefFoundError
- aop
- 의존성
- java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
- 횡단 관심
- multiple SLF4J bindings
- LoggingEvent
- Class path contains multiple SLF4J bindings
- SqlSessionFactoryBean
- aspect oriented programming
- exclude-mapping
- 컨트롤러
- 의존성 주입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |