[Flex4.5] 로깅

플렉스 프레임웍에는 로깅 패키지가 존재한다.
trace() 만 사용했었는데 이런것도 있었나 봅니다.

일단 로깅을 하기위해서는 로거객체를 생성한다.
로거 객체는 Log 클래스의 static 메소드인 getLogger(String) 를 호출하면 ILogger 으로 리턴한다.

mx.logging.Log.getLogger(category:String):ILogger


참고로 저 매개변수인 category 는 아무거나 넣어도 상관없다.(아래 설명)

 

<?xml version="1.0" encoding="utf-8"?>

<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 

xmlns:s="library://ns.adobe.com/flex/spark" 

xmlns:mx="library://ns.adobe.com/flex/mx"

width="400" height="300"

>

<fx:Script>

<![CDATA[

import mx.events.FlexEvent;

import mx.logging.ILogger;

import mx.logging.Log;

private var myLogger:ILogger = Log.getLogger("category");

protected function button1_clickHandler(event:MouseEvent):void

{

this.myLogger.debug("click ");

}

]]>

</fx:Script>

<s:layout>

<s:VerticalLayout paddingTop="10" paddingLeft="10"/>

</s:layout>

<s:Button label="Button" click="button1_clickHandler(event)"/>

</s:Panel>


소스설명 
Panel 을 상속받고 내부에 버튼이 있습니다.
버튼을 클릭하면 이벤트 핸들러에서 로거 객체에 "click" 라는 문자열을 보내게 되어있습니다.


이 컴포넌트를 애플리케이션에 추가를 하고 사용하면 아래와 같다.
 

<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"

  xmlns:s="library://ns.adobe.com/flex/spark"

  xmlns:mx="library://ns.adobe.com/flex/mx"

  xmlns:com="com.*"  

  minWidth="955" minHeight="600">

<com:MyComponent x="171" y="164">

</com:MyComponent>

</s:Application>



 하지만 버튼을 클릭해봐도 로그가 찍히지 않는다.

로그가 찍히기 위해서는 애플리케이션소스에 <s:TraceTarget ... /> 를 추가 해야 한다.

<?xml version="1.0" encoding="utf-8"?>

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"

  xmlns:s="library://ns.adobe.com/flex/spark"

  xmlns:mx="library://ns.adobe.com/flex/mx"

  xmlns:com="com.*"  

  minWidth="955" minHeight="600">

<fx:Script>

<![CDATA[

import mx.logging.LogEventLevel;

]]>

</fx:Script>

<fx:Declarations>

<s:TraceTarget

  includeCategory="true"

  includeLevel="true"

  includeDate="true"

  includeTime="true" 

  level="{LogEventLevel.DEBUG}"

  fieldSeparator=" | "/>

</fx:Declarations>

<com:MyComponent x="37" y="21" width="400">

</com:MyComponent>

</s:Application>



소스설명
 <fx:Declarations> 영역에 <s:TraceTarget> 를 추가하고 옵션을 설정합니다.

  • includeCategory = 이 부분이 로거 객체를 얻을때 넣었던 category 문자열입니다.
  • includeLevel = 레벨을 표시합니다.Flex 에서는  ALL, DEBUG, INFO, WARN, ERROR, FATAL 이 있습니다.
  • includeDate = 날짜를 표시합니다.
  • includeTime = 시간을 표시합니다. 
  • level = 로그 레벨을 설정합니다. 이때는  LogEventLevel의 상수를 사용하는게 바람직합니다.
    로그 레벨에 대해서는 따로 포스팅을 해야겠네요^^;
  • fieldSeparator = 각 옵션을 나누는 구분자입니다.

위와 같이 한다면 콘솔에 표시되는 로그는 아래와 같다. 

7/20/2011 | 18:47:44.796 | [DEBUG] | category | click 


 아까 대충 넘어갔던 category 문자열은 저런 용도로 표시된다.
 
 
전용 Logger는 반드시 쓸수 있도록 지향해야 한다.
java 에서syso (System.out.print()) 를 사용하지 않고 Log4j 를 사용하는것과 마찬가지다.
특히 자바에서 과도한(특히 반복문)syso는 많은 리소스를 잡아먹는 원인중 하나이고. 불필요한 정보들은 로그분석을 어렵게 한다. 그래서 대부분 배포시에 로그부분을 삭제하거나 대부분 주석처리를 하도록 가이드를 하게된다. ( Log API 을 사용하면 레벨조정으로 해결됩니다)