본문 바로가기

Android

안드로이드 스튜디오 log 찍기 & 중간에 값 확인하기

애플리케이션을 실행할 때 둘 이상의 활동 클래스가 있을 수 있다

어떤 활동 클래스가 정보를 기록했는지 구별하기 위해 

클래스 이름을 나타내는 를 logcat사용한다 TAG

 

 

 

 

급한 사람은

//    private static final String TAG = "MainActivity";
private final String TAG = this.getClass().getSimpleName().trim().substring(0, 22);
Log.v(TAG ,"onClick : " + mailServer);

 

안드로이드 스튜디오에서 로그를 찍으려면

파라미터가 여러 개 필요하단다

Log Class를 한번 훔쳐보도록 하겠다 

나는 영어를 잘 몰라서 번역을 해놓았다

/*
 * Copyright (C) 2006 The Android Open Source Project
 *//* Copyright (C) 2006 안드로이드 오픈소스 프로젝트

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 
 *//Apache 라이센스 버전 2.0("라이센스")에 따라 라이센스가 부여되었습니다. 
 * 라이센스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다. 
 * 라이센스 사본은 다음에서 얻을 수 있습니다.
 
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
	//해당 법률에서 요구하거나 서면으로 동의하지 않는 한, 
	라이센스에 따라 배포되는 소프트웨어는 * 명시적이든 묵시적이든 어떠한 종류의 보증이나 
	조건 없이 "있는 그대로" 배포됩니다. * 라이센스에 따른 허가 및 제한 사항을 관리하는 
	특정 언어는 라이센스를 참조하십시오.


package android.util;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.UnknownHostException;

/**
 * Mock Log implementation for testing on non android host.
 */* 안드로이드가 아닌 호스트에서 테스트하기 위한 모의 로그 구현.
 
public final class Log {

    /**
     * Priority constant for the println method; use Log.v.
     */
    public static final int VERBOSE = 2;

    /**
     * Priority constant for the println method; use Log.d.
     */
    public static final int DEBUG = 3;

    /**
     * Priority constant for the println method; use Log.i.
     */
    public static final int INFO = 4;

    /**
     * Priority constant for the println method; use Log.w.
     */
    public static final int WARN = 5;

    /**
     * Priority constant for the println method; use Log.e.
     */
    public static final int ERROR = 6;

    /**
     * Priority constant for the println method.
     */
    public static final int ASSERT = 7;

    private Log() {
    }

    /**
     * Send a {@link #VERBOSE} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int v(String tag, String msg) {
        return println(LOG_ID_MAIN, VERBOSE, tag, msg);
    }

    /**
     * Send a {@link #VERBOSE} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     */
    public static int v(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, VERBOSE, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Send a {@link #DEBUG} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     */
    public static int d(String tag, String msg) {
        return println(LOG_ID_MAIN, DEBUG, tag, msg);
        
        //{@link #DEBUG} 로그 메시지를 보냅니다. 
        * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
        * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
        * @param msg 기록하려는 메시지입니다. 
        */ public static int d(String tag, String msg) 
        { return println(LOG_ID_MAIN, DEBUG, tag, msg);
    }

    /**
     * Send a {@link #DEBUG} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     
     ///** * {@link #DEBUG} 로그 메시지를 보내고 예외를 기록합니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 일반적으로 식별 
     * 로그 호출이 발생하는 수업이나 활동. * @param msg 기록하려는 메시지입니다. 
     * @param tr 로그에 대한 예외
     */
    public static int d(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, DEBUG, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Send an {@link #INFO} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     
     //{@link #INFO} 로그 메시지를 보냅니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param msg 기록하려는 메시지입니다.
     */
    public static int i(String tag, String msg) {
        return println(LOG_ID_MAIN, INFO, tag, msg);
    }

    /**
     * Send a {@link #INFO} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     
    //* {@link #INFO} 로그 메시지를 보내고 예외를 기록합니다. 
    * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
    * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
    * @param msg 기록하려는 메시지입니다. * @param tr 로그에 대한 예외
     */
    public static int i(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, INFO, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Send a {@link #WARN} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     //* {@link #WARN} 로그 메시지를 보냅니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param msg 기록하려는 메시지입니다.
     */
    public static int w(String tag, String msg) {
        return println(LOG_ID_MAIN, WARN, tag, msg);
    }

    /**
     * Send a {@link #WARN} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     //{@link #WARN} 로그 메시지를 보내고 예외를 기록합니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param msg 기록하려는 메시지입니다. * @param tr 로그에 대한 예외
     */
    public static int w(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, WARN, tag, msg + '\n' + getStackTraceString(tr));
    }

    /*
     * Send a {@link #WARN} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param tr An exception to log
     //* {@link #WARN} 로그 메시지를 보내고 예외를 기록합니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param tr 로그에 대한 예외
     */
    public static int w(String tag, Throwable tr) {
        return println(LOG_ID_MAIN, WARN, tag, getStackTraceString(tr));
    }

    /**
     * Send an {@link #ERROR} log message.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     //* {@link #ERROR} 로그 메시지를 보냅니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param msg 기록하려는 메시지입니다.
     */
    public static int e(String tag, String msg) {
        return println(LOG_ID_MAIN, ERROR, tag, msg);
    }

    /**
     * Send a {@link #ERROR} log message and log the exception.
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @param tr An exception to log
     //* {@link #ERROR} 로그 메시지를 보내고 예외를 기록합니다. 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param msg 기록하려는 메시지입니다. * @param tr 로그에 대한 예외
     */
    public static int e(String tag, String msg, Throwable tr) {
        return println(LOG_ID_MAIN, ERROR, tag, msg + '\n' + getStackTraceString(tr));
    }

    /**
     * Handy function to get a loggable stack trace from a Throwable
     * @param tr An exception to log
     * Throwable에서 로그 가능한 스택 추적을 가져오는 편리한 함수 
     * @param tr 로그에 대한 예외
     */
    public static String getStackTraceString(Throwable tr) {
        if (tr == null) {
            return "";
        }

        // This is to reduce the amount of log spew that apps do in the non-error
        // condition of the network being unavailable.
        // 이는 네트워크를 사용할 수 없는 
        // 오류가 아닌 조건에서 앱이 수행하는 로그 유출량을 줄이기 위한 것입니다.
        Throwable t = tr;
        while (t != null) {
            if (t instanceof UnknownHostException) {
                return "";
            }
            t = t.getCause();
        }

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        tr.printStackTrace(pw);
        pw.flush();
        return sw.toString();
    }

    /**
     * Low-level logging call.
     * @param priority The priority/type of this log message
     * @param tag Used to identify the source of a log message.  It usually identifies
     *        the class or activity where the log call occurs.
     * @param msg The message you would like logged.
     * @return The number of bytes written.
     //낮은 수준의 로깅 호출. 
     * @param Priority 이 로그 메시지의 우선순위/유형 
     * @param 태그 로그 메시지의 소스를 식별하는 데 사용됩니다. 
     * 일반적으로 로그 호출이 발생하는 클래스나 활동을 식별합니다. 
     * @param msg 기록하려는 메시지입니다. * @return 쓴 바이트 수입니다.
     */
    public static int println(int priority, String tag, String msg) {
        return println(LOG_ID_MAIN, priority, tag, msg);
    }

    /** @hide */ public static final int LOG_ID_MAIN = 0;
    /** @hide */ public static final int LOG_ID_RADIO = 1;
    /** @hide */ public static final int LOG_ID_EVENTS = 2;
    /** @hide */ public static final int LOG_ID_SYSTEM = 3;
    /** @hide */ public static final int LOG_ID_CRASH = 4;

    /** @hide */ @SuppressWarnings("unused")
    public static int println(int bufID,
            int priority, String tag, String msg) {
        return 0;
    }
}

 

각 Log Level 이 존재하고 앞 글자를 따서 메서드 이름으로 사용하고 있다.

공통적으로 String tag를 파라미터로 받는데

이 부분이 로그 찍을 때 어디서 로그를 찍었는데 나타내는 용도로 이용된다.

보통 많은 사람들이 Class를 만들고 첫 줄에 다음과 같은 코드를 작성할 것이다.

https://developer.android.com/reference/android/util/Log#constants_1

 

Log  |  Android Developers

 

developer.android.com

 

안드로이드 스튜디오 Log에 대한 좋은 팁이다

 

 

 

그러나 Rename 등의 Refactoring 과정을 거친다면 하드코딩된 부분은 매뉴얼로 수정할 수밖에 없다.

그러나 다음과 같은 방법으로 이용할 수 있다. 

private final String TAG = this.getClass().getSimpleName().trim().substring(0, 22);

해당 getClass(). getName() 은 패키지 경로까지 다 나타내므로 getSimpleName()을 이용하고

trim()으로 공백도 제거해준다. 그리고 가장 중요한 것은... Log의 String tag length는 23 이하여야 한다.

그래서 substring으로 22까지 줬다. 이게 바로 간편하고 심플한 방법이다. 

그러나.. 당최 왜 23 이하로 써야 하는지 모르겠다..

따라서 다시 구글링 ㄱㄱ 그리고 한 답변을 발견했다.

 

 

Below API 26 (Oreo) the limit of system property keys was 31 characters. And "log.tag.".length() + 23 equals 31. If you call Log.isLoggable below Android Oreo with a tag longer than 23 characters it will throw, as described in the source code. Since Android O this limit no longer applies.

결국 오레오 이하의 버전을 위한 조치였군.. 호환성을 생각해야 하는 안드로이 드니까.. 오레오가 deprecated 될 정도로 오랜 시간이 지나면 안 써도 되겠군..

 

 

Log ~ () 를 사용합니다. 종류로는

 

 

총 다섯가지의 종류가 있습니다. 기본적으로 1번 째 인자 : 태그 / 2번 째 인자 : 로그 내용 을 넣습니다.

​v Verbose 주석같은 느낌 / i Info(정보) / d Debug(디버그) / w Warning(경고) / e Error(오류)입니다.