Android Log 源码介绍

1.关于Log源码介绍

  • Log对象,它位于android framework层utils包下,是一个final class类

    • 源码如下所示,可以看到其实final类,所以不能通过继承Log类的方式实现自身的日志工具类,一般可以通过定义Log成员变量的方式,封装Log工具方法。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    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;
    }
    }

2.Log日志的种类

  • Android中日志级别有哪几种?
    • 1.Log.v 的输出颜色为黑色的,输出大于或等于VERBOSE日志级别的信息,也就是可见级别,一般是最低的信息提示
    • 2.Log.d的输出颜色是蓝色的,也就是调式级别,一般不会中止程序,一般是程序员为了调试而打印的log
    • 3.Log.i的输出为绿色,输出大于或等于INFO日志级别的信息,也就是信息界级别,不会中止程序,一般是系统中执行操作的信息提示
    • 4.Log.w的输出为橙色, 输出大于或等于WARN日志级别的信息,也就是警告级别,一般不会中止程序,但是可能会影响程序执行结果
    • 5.Log.e的输出为红色,仅输出ERROR日志级别的信息,也就是错误级别,一般会中止程序运行,是最严重的Log级别。
    • 解释:
      • verbose
      • debug调试
      • info信息
      • warn警告
      • error误差
  • 通过查看源代码我们发现Log类中所有的静态日志方法Log.v(),Log.d(),Log.i(),Log.w(),Log.e()等方法都是底层都是调用了println方法,然后在源码中查看,其实其内部调用的是println_native方法,也就是通过JNI调用底层的c++输出日志。