“System.out.println”이 Android에서 작동하지 않는 이유는 무엇입니까?


191

콘솔에서 무언가를 인쇄하여 디버깅 할 수 있습니다. 그러나 어떤 이유로 든 내 안드로이드 응용 프로그램에는 아무것도 인쇄되지 않습니다.

그런 다음 어떻게 디버깅합니까?

public class HelloWebview extends Activity {
    WebView webview;    
    private static final String LOG_TAG = "WebViewDemo";
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new MyWebChromeClient());
        webview.loadUrl("http://example.com/");    
        System.out.println("I am here");
    }

4
아래에 답변이 있지만 SOP 문의 출력도 LogCat으로 지정됩니다. 태그 이름 만 System.out
Samuh

1
0.9 System.out이 손실되기 전에 생각합니다. 그것이 로그 캣 출력에 전달 된 후 : code.google.com/p/android/issues/detail?id=92 . (기존 라이브러리 또는 System.out을 사용하는 라이브러리를 사용하는 경우 (올바르거나 잘못된 경우) 이후 버전의 Android와 함께 logcat에 표시됩니다.
Charlie Collins

logcat 안에 System.out.printlns가 있습니다.
rDroid

답변:


212

보정:

에뮬레이터에서 대부분의 장치 System.out.println는 LogCat로 리디렉션되고를 사용하여 인쇄됩니다 Log.i(). 매우 오래된 또는 사용자 정의 Android 버전에서는 그렇지 않을 수 있습니다.

실물:

메시지를 보낼 콘솔이 없으므로 System.out.println메시지가 손실됩니다. 같은 방법으로을 사용하여 "전통적인"Java 응용 프로그램을 실행할 때 이런 일이 발생합니다 javaw.

대신 Android Log클래스를 사용할 수 있습니다 .

Log.d("MyApp","I am here");

그런 다음 Eclipse 의 Logcat 보기에서 또는 다음 명령을 실행하여 로그를 볼 수 있습니다 .

adb logcat

잡히지 않은 예외의 스택 추적도 표시되므로 logcat 출력을 보는 습관을들이는 것이 좋습니다.

모든 로깅 호출의 첫 번째 항목은 로그 메시지의 소스를 식별하는 로그 태그입니다. 이는 메시지 출력 만 표시하도록 로그 출력을 필터링 할 때 유용합니다. 로그 태그와 일관성을 유지하려면 static final String어딘가에 한 번 정의하는 것이 가장 좋습니다 .

Log.d(MyActivity.LOG_TAG,"Application started");

Log다음 레벨 에 해당하는 5 가지 1 문자 방법이 있습니다.

  • e() -오류
  • w() -경고
  • i() -정보
  • d() -디버그
  • v() -상세
  • wtf() -끔찍한 실패

문서는 레벨에 대한 다음 말한다 :

Verbose는 개발 중을 제외하고는 응용 프로그램으로 컴파일해서는 안됩니다. 디버그 로그는 컴파일되지만 런타임에 제거됩니다. 오류, 경고 및 정보 로그는 항상 유지됩니다.


30
실제로-System.out은 Log.i ()를 통해 LogCat에 인쇄됩니다.
kaspermoerch

7
@JosephEarl-편집 버튼을 사용하십시오.
Dave Webb

10
:-) 또한 Log.wtf ()가
Zorb

2
System.out.println은 Android Studio의 Android Monitor 아래에 표시됩니다. 이것들은 "I / System.out"으로 표시됩니다
PVS

새로운 콘솔 애드 인 라이브러리도 매우 유용합니다.
PaulMcG


13

그렇습니다. 에뮬레이터를 사용하는 경우 System.out태그 아래의 Logcat보기에 표시됩니다 . 무언가를 쓰고 에뮬레이터에서 사용해보십시오.


2
이 답변 외에도 System.out을 사용하여 "무언가 발생"하고 입력이 인쇄되지 않는다는 점을 명심하십시오. 이 경우 에뮬레이터를 닫고 다시 시작하십시오. 이것은 나를 위해 일했습니다.
바이런 가브 라스

1

물론 logcat에서 결과를 보려면 Log level을 최소한 "Info"( logcat 의 log level)로 설정해야합니다 . 그렇지 않으면, 나에게 일어난 것처럼, 당신은 당신의 결과를 볼 수 없습니다.


1

실제로 작동하려면 System.out.println이 필요한 경우 (예 : 타사 라이브러리에서 호출) 리플렉션을 사용하여 System.class에서 필드를 변경할 수 있습니다.

try{
    Field outField = System.class.getDeclaredField("out");
    Field modifiersField = Field.class.getDeclaredField("accessFlags");
    modifiersField.setAccessible(true);
    modifiersField.set(outField, outField.getModifiers() & ~Modifier.FINAL);
    outField.setAccessible(true);
    outField.set(null, new PrintStream(new RedirectLogOutputStream()); 
}catch(NoSuchFieldException e){
    e.printStackTrace(); 
}catch(IllegalAccessException e){
    e.printStackTrace(); 
}

RedirectLogOutputStream 클래스 :

public class RedirectLogOutputStream extends OutputStream{
    private String mCache;

    @Override
    public void write(int b) throws IOException{
        if(mCache == null) mCache = "";

        if(((char) b) == '\n'){
            Log.i("redirect from system.out", mCache);
            mCache = "";
        }else{
            mCache += (char) b;
        }
    }
}

1

응용 프로그램에 표시되지 않습니다 ... 에뮬레이터의 logcat 아래에 있습니다.


1
이것은 OP의 첫 문장입니다. "콘솔에서 무언가를 인쇄하고 싶습니다"
Farid

0

휴대 전화에 읽을 수있는 장소가 없습니다. System.out.println();

대신, 무언가의 결과를보고 싶다면 logcat/console창을 보거나 a Toast또는 a Snackbar(최신 장치 인 경우) 메시지와 함께 장치 화면에 표시하십시오.) 확인해야 할 때 내가하는 일 예를 들어 switch case코드에 들어가는 곳 ! 즐거운 코딩 되세요! :)


1
클릭 Android Monitor한 다음을 클릭하면 logcat많은 메시지가 지속적으로 인쇄되는 것을 볼 수 있습니다. 그렇다면 내 디버그 메시지를 어떻게 볼 수 있습니까?

난 그냥 다른 것들을 스크롤하고 그것을 찾으십시오 : D
Valentin Filyov


0

나는 이것을 주요 방문자가 할 수 없었던 것에 대해 더 많은 방문객을 위해 남겨 둘 것 System.out.println입니다.

public class LogUtil {

private static String log = "";
private static boolean started = false;
public static void print(String s) {
    //Start the thread unless it's already running
    if(!started) {
        start();
    }
    //Append a String to the log
    log += s;
}

public static void println(String s) {
    //Start the thread unless it's already running
    if(!started) {
        start();
    }
    //Append a String to the log with a newline.
    //NOTE: Change to print(s + "\n") if you don't want it to trim the last newline.
    log += (s.endsWith("\n") )? s : (s + "\n");
}

private static void start() {
    //Creates a new Thread responsible for showing the logs.
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true) {
                //Execute 100 times per second to save CPU cycles.
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //If the log variable has any contents...
                if(!log.isEmpty()) {
                    //...print it and clear the log variable for new data.
                    System.out.print(log);
                    log = "";
                }
            }
        }
    });
    thread.start();
    started = true;
}
}

용법: LogUtil.println("This is a string");


-5

최근에 Android Studio 3.3에서 동일한 문제가 발견되었습니다. 다른 Android 스튜디오 프로젝트를 닫고 Logcat이 작동하기 시작했습니다. 위의 대답은 전혀 논리적이지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.