IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]【Android 开发入门】android studio 控制台打印输出日志

    testcs_dn发表于 2016-12-17 22:59:33
    love 0

    有些情况下,不方便使用断点的方式来调试,而是希望在控制台打印输出日志,使用过Eclipse的同学都知道Java可以使用 System.out.println(""); 来在控制台打印输出日志,但是在android studio中却是不行的,还是有差别的,那应该用什么呢?

    android.util.Log

    在调试代码的时候我们需要查看调试信息,那我们就需要用Android Log类。

    android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。

    1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");

    2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.

    3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息

    4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。

    5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。

    注意:不同的打印方法在使用时都是某个方法带上(String tag, String msg)参数,tag表示的是打印信息的标签,msg表示的是需要打印的信息。

    Log.java类

    /*
     * Copyright (C) 2006 The Android Open Source Project
     *
     * 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
     *
     *      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);
        }
    
        /**
         * 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
         */
        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.
         */
        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
         */
        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.
         */
        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
         */
        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
         */
        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.
         */
        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
         */
        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
         */
        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.
         */
        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;
        }
    }
    
    有小伙伴问我怎么在Android Studio中查看Log类?


    在代码编辑器中,将光标定位在Log上,然后按下快捷键:Ctrl+B,就可以打开类文件了。

    Logcat窗口


    我还真不知道这个窗口能不能完全关闭掉,它好像是和Android Monitor 是一体的。如下图:


    我们可以在logcat上按下然后拖动鼠标,把它拉出来,弹出一个单独的窗口。


    关闭窗口之后,它又会回到Android Monitor 上。


    上图中点击Restore ‘logcat’View 之后又弹出窗口,而不是和Android Monitor并排在标签上;

    这时你可以在 ‘logcat’标签上按钮鼠标左键拖动它到Monitor标签旁边松开鼠标,它就回去了。


    你也可以通过下拉列表框中的选项,或右侧的搜索框输入指定的关键词来筛选日志内容。


    也可以通过右侧的编辑筛选配置来创建特定的筛选类型,方便以后使用。


    小结

    关于日志的使用就说这么多。

    通过打印输出日志来调试是一种方法,却不是一种万能的方法。

    为什么这么说呢?

    因为有些时候(比如线程、网络操作之类的),打印日志的时候没有Bug,但把日志关了就会出Bug。

    有些情况是调试模式运行的时候不出Bug,而正式运行的时候就出Bug。

    上一篇:走进Android开发的世界,HelloWorld

    系列导航:【Android 开发入门】

    ===========文后小料============ 

    真正改变命运的其实并不是知识,而是这些知识带给你的能力的提高。也就是说,转化为能力的知识,才能够改变你的命运。
    当你去追求一个百分之百的安全感的时候,你可能就只能把自己困在原地,哪儿都去不了,其实这是最不安全的。
    今天这一代的员工,一定是通过提升自己的能力换来自己的安全。我们也更倾向于把价值存在朋友圈里边。

    ===========文档信息============ 
    版权声明:非商用自由转载-保持署名-注明出处 
    署名(BY) :testcs_dn(微wx笑) 
    文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)



沪ICP备19023445号-2号
友情链接