Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

[Local] 통합log 처리 방법, log4j, SocketAppender + SocketHubAppender

OpenSource/log4j&slf4j 2014.02.18 17:28
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

<< 제 목 >>

SocketAppender + SocketHubAppender를 이용한 통합 Log

 

<< 목 적 >>

하나의 깡통에 여러개의 node로 분리가 되어있어서 log 보기 어려우셨죠?

로그를 소켓 서버를 띄워서 거기로 모아보겠습니다. 그 소켓서버는 로컬에서 접속을 할 수 있도록

socketHub를 띄운 뒤 local에서는 viewer를 통해 socket hub에 접속! 하여 통합된 로그를 보도록 할 것 입니다.

참 쉽죠잉?? 한마디로 통합 로그!!

 

<< 그 림 >>

 

 

<< 환 경 >>

OS : Win 7 , 64bit

Jdk : 1.6



<< Socket Server 작동!! >>

cmd창에서 log4j-1.2.17.jar와 log4j-server.properties가 있는 곳으로 이동하여 아래의 명령어를 실행.

java -classpath ./log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 8081 log4j-server.properties

Tip. 여러개의 jar를 필요에 의해 같이 묶을 수 있다.[ ; 로 구분해서 뒤에 붙여주면 된다. ^-^good~]

ex) C:\Users\acet\Downloads>java -classpath ./log4j-1.2.17.jar;./acetCmn-1.0.jar;./log4kt-1.6.jar org.apache.log4j.net.SimpleSocketServer 8081 log4j-server.properties


동작 시 아래와 같이 로그들이 보입니다^^;

 

log4j=server.properties 내용


log4j.rootLogger=DEBUG, CA, FA, HU

#

log4j.appender.CA=org.apache.log4j.ConsoleAppender

log4j.appender.CA.layout=org.apache.log4j.PatternLayout

log4j.appender.CA.layout.ConversionPattern=[%d] [%t] [%m]%n

log4j.appender.CA.Threshold=DEBUG


#

log4j.appender.FA=org.apache.log4j.FileAppender

log4j.appender.FA.File=result.log

log4j.appender.FA.layout=org.apache.log4j.PatternLayout

log4j.appender.FA.layout.ConversionPattern=[%d] [%t] [%m]%n

log4j.appender.FA.Threshold=DEBUG


#

log4j.appender.HU=org.apache.log4j.net.SocketHubAppender

log4j.appender.HU.port=9999

log4j.appender.HU.locationInfo=true


# Tip. RollingFileAppender 부분~

1) rootLogger에 추가 : log4j.rootLogger=RFA

2) Appender에 추가 

log4j.appender.RFA=org.apache.log4j.RollingFileAppender

log4j.appender.RFA.File=loging.log

log4j.appender.RFA.MaxFileSize=1MB

log4j.appender.RFA.MaxBackupIndex=1

log4j.appender.RFA.layout=org.apache.log4j.PatternLayout

log4j.appender.RFA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n



<< log4j.xml 셋팅 - Local PC 2대 설정 >>

 1) SocketAppender 설정

<appender name="socket" class="org.apache.log4j.net.SocketAppender">  

    <param name="Port" value="8081" />  

    <param name="RemoteHost" value="xx.xxx.xxx.xx" />  

    <param name="ReconnectionDelay" value="10000" />  

    <param name="Threshold" value="ALL" />  

</appender> 


<param name="locationInfo" value="true" /> 이녀석을 통해..locationInfo를 기대해보았지만...음..차이를 못느끼겠다. OTL =3=3



<< TEST 시나리오 >>

1) Socket Server를 기동

2) 이기종 Local PC 프로젝트 기동

3) OtrosLogViewer 기동 및 SocketHub Connection

4) Log 발생(Local PC 2대)

아래처럼 web에서 로그를 발생 시킵니다.

5) SocketHub를 통해 확인

   아래와 같이 OtrosLogViewer 를 통해서 확인 합니다.



<< 결과 >>

결과적으로 OtrosLogViewer에서 2개의 로컬 PC log에 대해 확인을 할 수 가 있었다. Good~!!^-^/

또한 Thread의 포트로 구분이 가긴한다..

http-8080-5  / http-bio-8086-exec-12

 

 

<< 아쉬운 점.. >>

아쉬운 점으로는..SocketHubAppender가...layout을 설정을 할 수가 없어서..아쉽다..ㅋㅋ

혹은 OtrosLogViewer에서 UI에서 내가 나타내고자하는 정보가 없다..나타내려면 오픈소스를 수정해야 할 듯 싶다.

소스를 조금 볼려고 했더니..github...공부 할 때가 온것 같다 ㅋㅋㅋㅋ대세라 카던데..암튼 이상 입니다^^;


                                          - END -







acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

log4j를 알아보자

OpenSource/log4j&slf4j 2014.01.09 11:39
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

log4j..계속 사용만 해왔지 정리를 한적이 없어서 정리를 해본다.

1. log4j란?

2. log4j 구조

3. log4j level

4. log4j 간단한 예

5. 참고 사이트

 

[1] log4j 란?

   자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈소스이다.

 

[2] log4j 구조

   log4j는 크게 3가지의 큰 뼈대를 가지고 있다.

   (1) Logger(Category : 요녀석은 잘 쓰지 않는다) : logging 메시지를 Appender에 전달.

   (2) Appender : 전달된 로깅 메시지를 파일, 콘솔,DB에 저장 할 지 지정하는 역할을 한다.

   (3) Layout : Appender가 어디에 출력 할 것인지 결정했다면 어떠한 형식으로 출력을 할 지

                      출력 layout을 결정

    tip. <root> :

 

 

[3] log4j level

      logging 레벨은 TRACE < DEBUG < INFO < WARN < ERROR and FATAL 이며,

      1) FATAL : 가장 크리티컬한 에러가 났을 때 사용.

      2) ERROR : 일반 에러가 났을 경우 사용.

      3) WARN : 에러는 아니지만 주의할 필요가 있을 때 사용.

      4) INFO : 일반 정보를 나타날 때 사용.

      5) DEBUG : 일반 정보를 상세히 나타낼 때 사용.

      6) TRACE : 가장 레벨이 낮은 단계, 보통 DEBUG로 많이 하며 TRACE는 본적이...;;

 

      debug 레벨로 했다면 INFO~FATAL까지 모두 logging이 되어집니다.

      운영모드라면 INFO레벨로 하면 됩니다.

 

 

 [4] log4j 간단한 예

 

   1) Appender and Layout 설정

  <appender name="ACET_CONSOLE" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out"/>
     <param name="Threshold" value="TRACE"/>
  

    <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c{1}.%M():%L] - %m%n"/>
  </layout>

</appender>   

 

2) Logger

    <logger name="kr.pe.acet" additivity="false"> 
       <appender-ref ref="ACET_CONSOLE"/>
        <level value="DEBUG" />
    </logger>

 

우선 설명을 들어가기전에 기본적인 내용을 알고 가자!

<1> 로그 파일명 설정주기(DatePattern)

  위의 예제는 console이라 적용되어있지 않다.

  그래서 아래의 내용을 보도록 하자. 언제 파일을 분리시키면 되는가? 하는 설정이다.

  <param name="DatePattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS}"/>

 <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>

'.'yyyy-MM : 매달 첫번째날에 로그파일을 변경한다.

'.'yyyy-WW : 매주의 시작시 로그파일을 변경한다.

'.'yyyy-MM-dd : 매일 자정에 로그파일을 변경한다.

'.'yyyy-MM-dd-a : 자정과 정오에 로그파일을 변경한다.

'.'yyyy-MM-dd-HH : 매 시간의 시작마다 로그파일을 변경한다.

'.'yyyy-MM-dd-HH-mm : 매분마다 로그파일을 변경한다.

 

<2> PatternLayout 포맷

로그를 어떤 포맷으로 남길지 결정한다.

layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰인다.

 

[표-1] 

형식

설명
%p debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m 로그내용이 출력됩니다
%d 로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%% % 표시를 출력하기 위해 사용한다.
%n 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c 카테고리를 표시합니다 
예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C 클래스명을 포시합니다. 
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l 로깅이 발생한 caller의 정보를 나타냅니다
%L 로깅이 발생한 caller의 라인수를 나타냅니다
%M 로깅이 발생한 method 이름을 나타냅니다.
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X

로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.

 

 자! 이제 위의 내용을 분석해보자~~

 우선 눈에 들어오는 것은 PatternLayout과 DEBUG, ConsoleAppender 가 있다.

 

  <appender name="ACET_CONSOLE" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out"/>
     <param name="Threshold" value="TRACE"/>

 

를 보면 Console에 남기는 것이고, Threshold가 TRACE다. Threshold는 이 appender에 명시 된 priority와 같거나 높은 메시지만 로깅을 한다는 뜻이다.

 

<layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c{1}.%M():%L] - %m%n"/>
  </layout>

</appender>   

 

역시나 Conlsoe 출력이며, PatternLayout를 사용하며, ConversionPattern을 사용 한다.

ConversionPattern :  the ConversionPattern parameter controls the contents of each line of output inside the log file

 

위에 명시 된 [표-1]을 보고 분석해보자.

"[%p][%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c{1}.%M():%L] - %m%n"/>

              %p : debug, info, warn, error, fatal 등의 priority 가 출력된다.

              %d : 로깅 이벤트가 발생한 시간을 기록합니다.

                      포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로

                      사용하며   SimpleDateFormat에 따른 포맷팅을 하면 된다  

             %c : 카테고리를 표시합니다 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.

                      위의 예제는 %c{1} 이므로 전체가 출력 된다.

             %M : 로깅이 발생한 method 이름을 나타냅니다.

             %L : 로깅이 발생한 caller의 라인수를 나타냅니다

             %m : 로그내용이 출력됩니다

             %n : 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.

             ex) [DEBUG][2014-01-09 14:42:03] [DEBUG] [DispatcherServlet.init():136] - Servlet 

                    'spring' configured successfully

         

 

[5] 참고 사이트

  1) http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

  2) http://logging.apache.org/log4j/2.x/manual/architecture.html     // log4j 아키텍처 그림 있음!

 

[6] 알아두면 좋은 Tip

   1) log4j1.2까지는 문제가 없으나 1.3부터는 category가 logger 태그로 흡수 되고, priority 태그가

       deprecated 취급을 하니 가능하면 logger, level 태그를 사용하는게 좋다.

     

  2) 아래의 내용은 어떻게 찍힐까??

     <logger name="kr.pe.acet">
         <level value="INFO" /> 

         <appender-ref ref="ACET_CONSOLE" />    
     </logger> 

 

     <root>

        <level value="DEBUG" />

        <appender-ref ref="ACET_CONSOLE" />

     </root>

 

root 카테고리에 DEBUG 레벨을 설정했으니, DEBUG 메시지도 출력되는게 맞는것이 아닌가하고 착각을 할 수 있는데, 설정한 logger(kr.pe.acet)의 로그 레벨이 INFO이므로, INFO 메시지까지만 출력이 된다. 즉, 해당 카테고리의 로그 레벨이 설정되어 있으면 그 로그 레벨을 따라간다는것이다. 

  (참조사이트 : http://blog.kangwoo.kr/54)


    3) http://sourceforge.net/p/mindtreeinsight/code/HEAD/tree/

        log를 보는 툴인 것 같다. 깔아서 사용은 하지 않았지만..소스를 받아서 분석은 하고 싶네요^^

  

추가 Tip

ex) <logger name="kr.pe.acet.dev" additivity="false">

부모격의 "kr.pr.acet" 의 logger로 설정이 되어있으면 중복으로 찍히는데 additivity의 옵션을 false로 

주면 중복으로 찍히지 않는다.



출처 : http://aircook.tistory.com/entry/log4j%EC%9D%98-additivity-%EC%98%B5%EC%85%98




   < 끝 >



  

 

 


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

package org.apache.log4j does not exist

OpenSource/log4j&slf4j 2013.10.08 09:27
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

오류 내역 : 

JUnit compile 시 package org.apache.log4j does not exist 라는 오류가 났다.


해결 방법 : 

Change the scope of the log4j dependency to compile or remove it.

scope를 compile 또는 주석처리 해주면 된다.


                <dependency>

                        <groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.16</version>

<exclusions>

<exclusion>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

</exclusion>

<exclusion>

<groupId>javax.jms</groupId>

<artifactId>jms</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jdmk</groupId>

<artifactId>jmxtools</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jmx</groupId>

<artifactId>jmxri</artifactId>

</exclusion>

</exclusions>

<!-- <scope>runtime</scope> -->

</dependency> 



참고 사이트 : http://stackoverflow.com/questions/8667640/maven-compilation-error-log4j


  - 끝 -


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바