안드로이드가 Log이 잘 안 나오는 이유를 드디어 알았습니다.

우수한 소프트웨어 시스템은 반드시 시스템 운행 과정에서 발생하는 이상 또는 비이상 데이터를 실시간으로 저장하여 시스템 운행 과정에서 발생하는 각종 행위를 기록하는데 나중에 문제를 발견하고 추적하며 문제를 해결하는 중요한 근거로 삼는다.일반적으로 출력 파일의 형식으로 저장되며, 동시에 선택적으로 컨트롤러에서 인쇄할 수 있다.로그 처리는 어떠한 소프트웨어 개발 과정에서도 없어서는 안 될 부분이라고 할 수 있다.
Android 응용 개발 단계에서 우리는 시스템이 제공하는 로그 인쇄 기능을 사용하여 Logcat 컨트롤러에 데이터 정보를 선택적으로 인쇄하여 추적 응용이 실행되는 상태를 더욱 직관적으로 디버깅할 수 있다. 예를 들어 클라이언트와 서버가 통신하는 과정에서 관련된 URL 링크, Request 요청 파라미터와response 응답 결과 등이다.
그러나 인쇄된 메시지의 길이가 너무 길면, 예를 들어 인터페이스 응답 결과가 너무 크면, Logcat 컨트롤러 데이터가 완전하지 못하게 됩니다.Log을 사용한 이래로 이 문제를 자주 겪었습니다. 이전에도 별로 신경 쓰지 않았습니다. 메시지가 너무 긴 경우도 드물었기 때문에 가끔 이런 경우는 Debug 도구를 통해 디버깅을 추적하고 해당하는response 정보를 Bejson 등 다른 보조 도구에 복사해서 포맷해서 훑어보는 것이 다소 불편했습니다.
나중에 조회를 통해 안드로이드 시스템의 단일 로그 인쇄 길이는 유한하다는 것을 알게 되었다. 밑바닥 Logger 드라이버의 한 종류Logger.h 헤더 파일에는 다음과 같은 두 줄의 코드가 있다.
#define LOGGER_ENTRY_MAX_LEN        (4*1024)  
#define LOGGER_ENTRY_MAX_PAYLOAD    \\  
    (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))  

시스템에서 단일 로그 정보를 표시하는 길이는 4*1024자 길이로 고정되어 있음을 알 수 있습니다!Logcat에서 사용하는 liblog 리소스 패키지에서도 Log로 인쇄된 메시지는 log 커널 드라이브에 의해 단축될 수 있습니다.
The message may have been truncated by the kernel log driver.

그중의 길이 제한을 이해하면 처리하기 쉽다.Message의 길이를 판단하여 로그 정보를 세그먼트로 출력할 수 있습니다. 예를 들어 다음과 같습니다.
if(xml.length() > 4000) {
 for(int i=0;i4000){
    if(i+4000"rescounter"+i,xml.substring(i, i+4000));
     else
        Log.i("rescounter"+i,xml.substring(i, xml.length()));
    }
} else
    Log.i("resinfo",xml);
}

참조 주소:
  • Android - Set max length of logcat messages
  • 안드로이드 로그 시스템 logcat 커널 코드 분석
  • 좋은 웹페이지 즐겨찾기