Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Log4j의 출력방향 전환하기
 
같은 애플리케이션내에서 서로 다른곳으로 log의 출력방향을 전환하고 싶을때 사용할 수 있는 xml configuration설정방법을 테스트해본다. ( 2003/07/16 ) 348
Written by ienvyou - 최지웅
1 of 1
 

흠.. 이글은 얼떨결에 쓰게 되는 아티클이라 그리 길지 않음을 먼저 알리며, 전홍성님과의
대화중에 결과가 나온 것을 글로서 적습니다.

▶ 동기

쫀님과의 대충의 대화내용을 살펴보면 Log4j를 이용하는데 있어서 EJB Container가 A, B와 
같이 2개가 떠있을 경우 A-Container에서는 stdout인 console로그를 남기고, B-Container에서는
file에 로그를 남기는 경우가 흔히 발생을 할 수 있라는 것이다.
기존의 제 아티클을 활용하여  테스트 하려 했으나 root라는 속성때문에 중복기록이라는
문제가 발생하여 해결점을 찾기 위함이 동기였다.

기존의 아티클을 읽고 싶다면 아래의 글을 먼저 읽기 바란다.

Log4j를 위한 여러가지 환경설정(xml property)XML Configuration의 변화 및 테스트 샘플의 변화

여기서 테스트하고자 하는 것은 logger의 appender가 추가되었을 경우 각 클래스 파일이
서로 다른 (예를 들면 A.class는 console에, B.class는 file에 로그를 남기는 경우) 로그를 다른 
형태로 남기고자 할때 사용하려는 것이다.

우선 기존의 fileConsole.xml config를 보도록 하자.


<?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- 
	파일에 로그를 기록하는 샘플입니다. 
	기본적으로 로그파일의 이름을 기록할 수 있으며
	해당설정은 root logger에 설정되어 있는 내용을 참조하여 설정이 가능합니다.
	즉, 파일과 콘솔로 즉시 출력이 가능하며 간단하게 테스트해볼수 있습니다.
-->
<log4j:configuration>
    
    <appender name="A1" class="org.apache.log4j.FileAppender">
    <param name="File" value="fileConsole.log"/>
    <param name="Append" value="false"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
        value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
    </layout>
    </appender>

    <appender name="A2" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-4r %-5p [%t] %37c %3x - %m%n"/>
    </layout>
    </appender>
     

    <root>
    <priority value ="debug" />
    <appender-ref ref="A1"/>
    <appender-ref ref="A2"/>
    </root>

</log4j:configuration>
    
위에서 보게 되면 appender가 정의가 되어지고 A1, A2의 appender의 형태가 하나는 파일이고 하나는 콘솔을 이용해서 출력을 내보낼 수 있게하는데 특징은 root element에 숨겨져있다. root속성으로서 appender-ref를 사용하게 되면 기본적으로 root가 가지고 있는 log속성을 그대로 이용하여 처리하게 되며, 각각의 Logger 객체를 얻어낼때 class형태라던지, String형태등이 해당 LogRepository에 등록되어 console, file모드를 모두 사용할 수 있게 한다. 문제점은 logger객체를 Logger.getLogger() 메소드를 통해 얻어냈을 때 출력방향을 제어할수 없다라는 것이다. 그렇다면 어떻게 수정을 하게 되면 쉽게 처리가 되어질 수 있을까? 기본적으로 log4j에서 제공하는 방법은 category element와 logger element를 제공하고 있다. 즉 root가 아닌 logger tag나 category tag를 사용해서 getLogger()메소드를 사용했을때 내가 원하는 로그형태만을 얻어낼수 있는 방법이다. 위의 xml파일을 수정한 전체 xml를 보도록 하자.

<?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!-- 
	파일에 로그를 기록하는 샘플입니다. 
	기본적으로 로그파일의 이름을 기록할 수 있으며
	해당설정은 root logger에 설정되어 있는 내용을 참조하여 설정이 가능합니다.
	즉, 파일과 콘솔로 즉시 출력이 가능하며 간단하게 테스트해볼수 있습니다.
-->
<log4j:configuration>
    
    <appender name="FILE_LOGGER" class="org.apache.log4j.FileAppender">
    <param name="File" value="fileConsole.log"/>
    <param name="Append" value="false"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
    </layout>
    </appender>

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-4r %-5p [%t] %37c %3x - %m%n"/>
    </layout>
    </appender>

    <logger name="a1">
       <appender-ref ref="CONSOLE"/>
    </logger>  

    <logger name="a2">
       <appender-ref ref="FILE_LOGGER"/>
    </logger>  
     

    <category name="fileLogger">
        <priority value="info"/>
        <appender-ref ref="FILE_LOGGER"/>
    </category>   

    <category name="consoleLogger">
        <priority value="info"/>
        <appender-ref ref="CONSOLE"/>
    </category>   


</log4j:configuration>
    
바뀐것이라고는 logger tag와 category tag의 추가 및 root의 속성요소가 없어졌다라는 것이다. 그렇다면 프로그램상에서 해당 logger만 사용하고 싶을 경우는 어찌할 것인가? 단순히 DOMConfigurator에서 로딩된 Logger객체에서 아래와 같이 쓰고 싶은 logger를 얻어내면 그만이다. Logger logger = LogUtil.getLogger("consoleLogger"); 위에서 consoleLogger를 얻어내게 되면 <appender-ref ref="CONSOLE"/> 이 참조되게 되면 해당 내역이 console에 출력이 되어질 수 있게 한다. 자 그렇다면 위의 경우는 category의 name에 설정된 것을 얻어냈는데 같은 출력을 얻게 하려면 어떻게 고치면 될까? 당연히 logger tag에 있는 appender를 이용해도 될것이다. <logger name="a1"> 위의 logger를 참조하게 한다면 결과값은 같게 나올것이다. Logger logger = LogUtil.getLogger("a1");Conclusion 간단하게 xml config를 변경하여 원하는 것을 얻는 것을 테스트해봤으며, 여러가지의 출력모드가 제공되고 있으므로 입맛에 맛게 변경하여 쓰면 무리가 없으리라 본다.
 
1
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD