2010-05-26 2 views
13

나는 안드로이드 장치에 기존 SDK를 구속하려고하고 있는데,이 SDK의 종속성 중 하나는 Apache log4j입니다. 내 테스트 프로그램을 안드로이드 에뮬레이터에로드 할 수 있지만 log4j 객체 "PropertySetter"가 호출되면 프로그램이 확인 예외로 실패합니다. 이 문제를 개선 할 수있는 방법이 있습니까?안드로이드에서 log4j 지원

+0

체크 아웃 안드로이드 로그인이 간단한 랩퍼 라이브러리 [https://github.com/oronno/log4android](https://github.com/oronno/log4android) –

+0

이 프로젝트를 확인하십시오 http://nikedlab.com/android-log-rolling-library.html – NikedLab

답변

3

나는 log4j 대신 slf4j를 바꾸는 것이 좋습니다. 고통없는 스위치는 아니지만 당신이 가지고있는 것보다 더 쉬울 것 같습니다. slf4j는 log4j를 포함한 여러 로거에 대한 공통 프론트 엔드를 제공하며 slf4j-android 패키지가 있습니다.

아니요, Android의 로깅 메커니즘이 좋지 않습니다. log4j가 당신을 위해 할 수있는 것과 비교하면 매우 부적합합니다.

13

실제로 slf4j를 사용하면 매우 고통스럽지 않은 프로세스가 나에게 드러났습니다. 적어도 일반적인 log4j 기능을 사용하는 라이브러리의 경우는 흔한 것처럼 보입니다. 당신은 정말에만 http://www.slf4j.org/download.html에서 프로젝트에 두 SLF4J 라이브러리를 추가, log4j에 대한에 SLF4J를 교환 할 필요가 없습니다 :

- 안드로이드에 대한 SLF4J 라이브러리 (현재 SLF4J-안드로이드 1.6.1-RC1.jar)
- slf4j (http://www.slf4j.org/legacy.html#log4j-over-slf4j) 브리지를 통해 log4j.

후자는 일반적인 구현에서 사용되는 핵심 log4j 클래스를 정의하고이를 slf4j Android 구현에 바인딩합니다. 라이브러리가 추가되면 코드가 작동합니다.

+0

감사합니다 ... (테스트 완료) – Hurda

+0

slf4j를 어떻게 Android에 통합했는지 조금 더 자세하게 설명 할 수 있습니까? 계획? Android 프로젝트에서 slf4j를 사용하려고하는데 log4j.properties 또는 log4j.xml 파일을 통해 구성하는 데 어려움을 겪고 있습니다. Log4j.properties 파일로 안드로이드 용 slf4j를 구성해야한다고 확신하지 못합니다. slf4j-for-android는 기본적으로 안드로이드 로깅에 대한 래퍼입니다 (결과적으로 log4j 대신 Android 로깅 설정을 사용해야합니다). – seanoshea

+0

slf4j-android에 대한 설정 파일이 없습니다. 시작할 때 로깅 수준을 구성 할 수 있습니다 에뮬레이터를 사용하고 logcat을 통해 로그를 탐색 할 때 – kokosing

5

나는 Log4j가 Socket Appender와 Log4j Chainsaw로 안드로이드에서 성공적으로 작업하고있다. 모든 코드는이 저장소에 있습니다. Slf4j가 설치되어 작동합니다. 프로그래밍 방식으로 구성해야한다는 점을 알고 있어야합니다. 파서가 안드로이드에서 작동하지 않을 .properties 또는 .xml 파일을 사용할 수 없습니다. 즐겨.

https://sourceforge.net/projects/log4j-android/

+0

전기 톱 및 소켓 어 펜더는 놀라운 것 같습니다 :) 많은 감사드립니다! –

2

log4j 구성 파일 파서는 당신이 사용하는 log4j에 클래스를 무시하고 안드로이드 로그 캣 스타일의 로깅을 사용하도록 강제 log4j에와 안드로이드 safe.slf4j의 안드로이드 호환성 일이 아니다. 당신은 여전히 ​​안드로이드에서 log4j의 완벽한 유연성을 얻지 못합니다. 내 프로젝트에서 안드로이드에 log4j 포팅 https://sourceforge.net/projects/log4j-android/ 당신이해야 할 일은 클래스 경로에 바이너리 디렉토리에 두 개의 병을 추가하는 것입니다. 그러면

static { 
    org.apache.log4j.Logger root = org.apache.log4j.Logger.getRootLogger(); 

    final SocketAppender appender = new SocketAppender("192.168.1.4", 4445); 


    root.addAppender(appender); 
} 

private static final org.slf4j.Logger logger = LoggerFactory.getLogger(MyClass.class); 

static { 
    logger.info("Hello logger"); 
} 

이렇게하면 지정한 원격 호스트로 메시지가 전송됩니다. 그런 다음 전기 톱 http://logging.apache.org/log4j/docs/webstart/chainsaw/chainsawWebStart.jnlp으로이 메시지를 볼 수 있습니다. 전기 톱 작업을하려면 대화 상자의 두 번째 확인란을 클릭하고 확인을 클릭하고 앱을 시작하면 새 탭이 표시됩니다. 귀하의 방화벽이 그것을 막을지도 모른다는 것을 알고 ...

+0

그냥 궁금해서. '안드로이드 호환성'이란 무엇입니까? 200 LOC 미만에서 자신의 속성 리더를 굴릴만큼 쉬운 것처럼 보입니다. –

+1

slf4j의 안드로이드 호환성을 언급했습니다. 그들은 실제로 log4j에 대한 지원을 추가하지 않습니다. 단지 log4j 클래스를 바이 패스 내부에서 자체적으로 우회합니다. 그런 다음 log4j로 이동하는 모든 로그를 logcat에 출력합니다. 로그캣이 쓸데없는 로그 시스템을 싫어하기 때문에 이것은 나에게 끔찍한 일이었습니다. log4j-android 프로젝트는 기본적으로 파서 클래스가 제거 된 안드로이드 버전입니다. 그런 다음 slf4j를 제거하여 log4j를 제거합니다. –

3

안드로이드에 log4j를 가능하게하는 새로운 프로젝트가 있습니다. 또한 slf4j에 log4j를 사용할 수도 있습니다. 또한 LogCat에 대한 appender를 제공합니다. Logging in Android using Log4J을 참조하십시오.

다음 예는 Android에서 log4j를 구성하고 사용하는 방법을 보여줍니다.

구성 안드로이드에서의 log4j 시스템

import org.apache.log4j.Level; 
import android.os.Environment; 
import de.mindpipe.android.logging.log4j.LogConfigurator; 
/** 
* Simply place a class like this in your Android applications classpath. 
*/ 
public class ConfigureLog4J { 
    static { 
     final LogConfigurator logConfigurator = new LogConfigurator(); 

     logConfigurator.setFileName(Environment.getExternalStorageDirectory() + "myapp.log"); 
     logConfigurator.setRootLevel(Level.DEBUG); 
     // Set log level of a specific logger 
     logConfigurator.setLevel("org.apache", Level.ERROR); 
     logConfigurator.configure(); 
    } 
} 

안드로이드의 log4j API를 사용하여 안드로이드에서 SLF4J의 API를 사용하여

import org.apache.log4j.Logger; 

public class ExampleLog4J { 
    private final Logger log = Logger.getLogger(LogConfiguratorTest.class); 

    public void myMethod() { 
     log.info("This message should be seen in log file and logcat"); 
    } 
} 

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

public class ExampleLog4JOverSLF4J { 
    private final Logger log = LoggerFactory.getLogger(ExampleLog4JOverSLF4J.class); 

    public void myMethod() { 
     log.info("This message should be seen in log file and logcat"); 
    } 
} 

로깅의 log4j를 사용하여 로그인

+2

방금 ​​사이트에서 복사했습니다 ...이 클래스는 무엇입니까? LogConfiguratorTest.class 그리고 어떻게 응용 프로그램 클래스 경로에 ConfigureLog4J를 배치하여 의미합니까, 내 코드 어딘가에 참조가 있나요? 사이트에있는 쓰레기가 아닌 완전한 예를 보여주십시오. – JPM

+0

이걸로 사용자 정의 Appender를 구성하는 방법 ?? –

+0

@ JPM 그는 아마도 LogConfiguratorTest.class 대신 ExampleLog4J.class를 의미했습니다. –