2012-11-15 3 views
3

다음은 PC에서 작동하지만 Android 시뮬레이터에서는 작동하지 않는 것으로 나타났습니다.Android에서 Logger로 로깅

Logger logger = Logger.getLogger("foo"); 
logger.log(Level.INFO, "Number is: {0}", new Object[]{new Integer(42)}); 

그냥

Number is: {0} 

왜이 안드로이드 실패 않습니다 인쇄?

+0

Android의 로깅 도구 참조 : http://developer.android.com/reference/android/util/Log.html 및 http://developer.android.com/tools/debugging/debugging-log.html – TheZ

+0

실패하면 무엇을 의미합니까? –

+0

감사합니다.이 점을 잊어 버렸습니다. – ejoerns

답변

0

사용 :

android.util.Log.i(TAG, "Number is: " + number); 

http://developer.android.com/reference/android/util/Log.html

+1

예, Android에서 선호하는 로그임을 알고 있습니다. 그러나 나는 로거 클래스가 안드로이드에서 작동하지만 포맷팅 방법은 그렇지 않은 이유에 대해 놀랐다. – ejoerns

1

당신은 정적 String.format(String format, Object... args) 방법을 사용하여 서식 같은 String을 수행 할 수 있습니다 참조하십시오 :

Log.d(TAG, String.format("Number is: %d", new Integer(42))); 
+0

그래, 내가 현재하고있는 방식이지만, 안드로이드와 PC 앱 모두에서 사용하고자하는 라이브러리에 있기 때문에'{0}'-Version이 작동하는 것을 선호한다. – ejoerns

4

나는 로터리 방식으로 해결책을 발견했다. 궁극적으로, 기본 안드로이드 로깅 구현에 어딘가에 포매터가있어 메시지를 렌더링하고 매개 변수를 무시한다고 생각합니다. 로깅 API를 사용하여 사용자 자신의 디자인 형식을 설치할 수 있어야합니다.

완전히 다른 이유로 인해 새로운 Handler가 이미 설치되었습니다. 내가 사용한 소스는 다음에서 확인할 수 있습니다. http://4thline.org/projects/download/misc/

핸들러는 teleal-common-1.0.14-source.tar.gz 아카이브에 있습니다. src \ main \ java \ org \ fourthline \ android \ util \ FixedAndroidHandler.java 경로를 따르십시오.

이 사이트는이 핸들러를 설치하는 코드도 제공하지만 다른 아카이브에 있습니다 : sash-1.0-SNAPSHOT.tar.gz. 1.0 \ src \ main \ java \ org \ teleal \ common \ logging \ LoggingUtil.java을 찾으십시오.

앱 시작 코드 어딘가에이 호출하여이 핸들러를 설치할 수 있습니다 : 나는 무엇을 발견

LoggingUtil.resetRootHandler(new FixedAndroidHandler()); 

이 핸들러에 대한 포맷터이 핸들러 내부 익명 클래스로 포함되는 것이 었습니다. 얼마나 편리한 지. Formatter가 LogRecord를 통해 전달 된 매개 변수를 처리하지 않은 것을 볼 수 있습니다. 난 그냥 "다른-경우"추가 조건 :

private static final Formatter THE_FORMATTER = new Formatter() { 
    @Override 
    public String format(LogRecord r) { 
     String msg = r.getMessage(); 
     Object[] params = r.getParameters(); 
     Throwable thrown = r.getThrown(); 
     if (thrown != null) { 
      StringWriter sw = new StringWriter(); 
      PrintWriter pw = new PrintWriter(sw); 
      sw.write(r.getMessage()); 
      sw.write("\n"); 
      thrown.printStackTrace(pw); 
      pw.flush(); 
      return sw.toString(); 
     } else if ((params != null) && (params.length > 0) && (msg.indexOf("{0") >= 0)) { 
      return MessageFormat.format(msg, params); 
     } else { 
      return r.getMessage(); 
     } 
    } 
}; 

테스트는 내가 본 다른 로그 포맷 코드와 일치합니다. 이론 상으로는 기존의 Handler에 비슷한 Formatter를 설치하는보다 직접적인 접근 방식을 취할 수 있어야합니다. 나는 위의 해결책이 나를 위해 일한다는 사실 때문에 나 자신을 시도하지 않았다.

+1

내 관심사는 ejoerns와 동일합니다. 이미 데스크톱 환경에서 실행되도록 작성되었으며 다시 사용할 수 있어야하는 컨트롤러 계층 코드가 많습니다.다시 돌아가서 android Log 클래스를 가져 와서 해당 코드를 모두 안드로이드 고유로 변경할 수는 없습니다. 안드로이드의 java.util.logging 구현은 마침내 안드로이드 로그를 연기합니다. 결국 LogCat과 호환되며 Log for를 사용할 것입니다. 그냥 막아야 할 틈이 있습니다. –