Programming > Java

[로그 출력 ] logback

Logback 사용방법

Java에서의 표현방법

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

...

// SLF4J + Logback
Logger logger = LoggerFactory.getLogger(Main.class.getName()); // this.getClass()
logger.info("my logging");

Log종류별 클래스 패스 지정

Logback를 사용하는 경우

1) slf4j-api-${version}.jar
2) logback-classic-${version}.jar
3) logback-core-${version}.jar

Log4j를 사용하는 경우

1) slf4j-api-${version}.jar
2) slf4j-log4j12-${version}.jar
3) log4j-${version}.jar

Java표준 Logger를 사용하는 경우

1) slf4j-api-${version}.jar
2) slf4j-jdk14-${version}.jar
3) rt.jar(Java Core)

 

 

파라메터 패턴  : %<변환지정자>{옵션}    
변환지정자 설정예 실행결과 설명
c, lo, logger %c sample.logback.Main 로거명칭을 출력
d, date %d 2015-10-24 00:36:55,947 날짜시간을 출력
  %d{HH:mm} 0:57 옵션으로 날짜포멧을 설정한다.
m, msg, message %m Hello Logback!! 로거에 넘길 메세지를 출력한다.
n a%n b a<개행> b 실행환경에 맞는 개행코드를 출력한다.
  a%n{}b a<개행>b  
p, le, level %p INFO 로그 레벨을 출력한다.
t, thread %t main 로그출력시 쓰레드명을 출력

** line (%line) 로그출력 라인번호

서식수식자 %[서식수식자]<변환지정자>  
  서식수식자 : [최소폭][.최대폭]  :: 정수  
설정예 출력문자열 실행결과 설명
[%5m] "123" [ 123] 최소폭지정, 오른쪽정렬로 설정치보다 작으면 빈칸으로 채움
  "123456" [123456] 설정치보다 크면 있는데로 출력
[%.5m] "123" [123] 최대폭지정
  "123456" [23456] 설정치보다 입력한 값이 많으면 왼쪽이 잘려나간다.
[%-5] "123" [123 ] 최소폭을 마이너스로 하면 왼쪽정렬을 한다.
[%.-5] "123456" [12345] 최대폭을 마이너스로 하면 오른쪽이 잘려나간다.
[%3.5m] "12" [ 12] 최소폭과 최대폭을 동시에 지정한다.
  "1234" [1234]  
  "123456" [23456]  
[%-3.-5m] "12" [12 ] 최소/최대폭지정시 마이너스를 붙일수도 있다.
  "1234" [1234]  
  "123456" [12345]  

 

Log4j Sample

Log4j Library

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

log4j-1.2.17.jar

log4j.properties  설정파일 (파일기준)

※ 클래스패스 아래에 저장한다.

# 루트 옵션으로 debug모드에 appender은 console로 설정
#   ※ appender명은 임의로 지정하면된다. (복수 가능)

# 별도의 로깅을 지정하지 않았을경우 root 카테고리에 속한다.
log4j.rootCategory=debug,console
 
# package 기준의 로깅을 지정한다.
log4j.logger.com.emunhi.first=info,console
log4j.additivity.com.emunhi.first=false

# 패키지별로 여러개 지정할 수 있다.  각각 로그레벨을 나누거나 로거를 나눈다.
log4j.logger.com.emunhi.second=error,console
log4j.additivity.com.emunhi.second=false
  
## console 로거에 대한 로거출력 설정을 한다.
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.immediateFlush=true
log4j.appender.console.encoding=UTF-8
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

위와 같이 했을경우, 아래와 같은 출력이 된다.
2021-07-14 14:00:05 WARN  MainLog4j:15 - warn...
2021-07-14 14:00:05 INFO  MainLog4j:17 - info...
2021-07-14 14:00:05 ERROR MainLog4j:18 - error...
2021-07-14 14:00:05 ERROR SubLog4j:13 - error...

log4j.xml 설정파일 (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="stdout" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>  
        </layout>  
    </appender>  
 
    <!-- 로그를 날짜별 파일로 남김 -->  
    <appender name="dailyFile" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="file" value="D://logs/dailyFile.log"/>  
        <param name="Append" value="true"/>
        <param name="encoding" value="UTF-8" />
        <param name="DatePattern" value="'.'yyMMdd"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>  
        </layout>  
    </appender>  
 
    <!-- xml파일로 로그를 남김 -->  
    <appender name="xmlFile" class="org.apache.log4j.FileAppender">  
        <param name="file" value="D://logs/xmlFile.xml"/>  
        <param name="Append" value="true"/>  
        <layout class="org.apache.log4j.xml.XMLLayout"/>  
    </appender>  
 
    <!-- 사이즈별로 남김 ※ 주의 :: 아래 예제는 백업을 2로 했기 때문에 초과하면 로그메세지 상실됨-->
    <appender name="rollBySize" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="target/log4j/roll-by-size/app.log" />
        <param name="MaxFileSize" value="10KB" />
        <param name="MaxBackupIndex" value="2" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </layout>
    </appender> 

    <!-- 패키지별로 로그를 지정함 -->
    <logger name="com.emunhi.first" additivity="false">
        <level value="WARN" />
        <appender-ref ref="dailyFile" />
        <appender-ref ref="stdout" />
    </logger> 
 
    <!-- root 로거 (전체) -->
    <root>  
        <level value="DEBUG"/>  
        <appender-ref ref="dailyFile"/>  
        <appender-ref ref="xmlFile"/>  
    </root>  
</log4j:configuration> 

 

Options 설명
옵션 내용
%p debug,info,warn,error,fatal 등의 priority 출력 (%-5p 의 경우 5칸 확보)
%m 로그내용 출력 message
%d 로그발생 날짜시간 출력
포멧 :  %d{yyyy/MM/dd HH:mm:ss} 와 같이 SimpleDateFormat 형식
%t 로그발생 Thread 이름을 출력
%F 로깅이 발생한 프로그램의 파일명을 출력
%l 로깅발생 caller 정보
%L 로깅발생 caller 라인수 출력
%M 로깅발생 method 이름 출력
% % 표시 출력
%n 각 플랫폼(OS)등에 맞는 개행문자 출력
%c 카테고리출력
카테고리(패키지)가  com.emunhi.aa.bb일경우 %c{3}이면 emunhi.aa.bb 가 출력
%C 클래스명 출력
클래스가  com.emunhi.aa.MyClass일경우 %C{3}이면 emunhi.aa.MyClass 가 출력
%r 어플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간 milliseconds 로 출력
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)출력
%X 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)출력
연관 클래스 설명
클래스 설명
ConsoleAppender org.apache.log4j.ConsoleAppender
콘솔에 로그메세지 출력
FileAppender org.apache.log4j.FileAppender
파일에 로그메세지 출력
RollingFileAppender org.apache.log4j.rolling.RollingFileAppender
파일크기라 지정값 이상되면 백업하고 다시기록한다.
DailyRollingFileAppender org.apache.log4j.DailyRollingFileAppender
지정된 기간(날짜) 단위로 파일을 생성한다.
JDBCAppender org.apache.log4j.JDBCAppender
DB에 로그를 저장,  JDBC정보는 parameter로 정의
SMTPAppender 이메일로 메세지 전송