Log.java revision 54b6cfa9a9e5b861a9930af873580d6dc20f773c
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.util;
18
19import com.android.internal.os.RuntimeInit;
20
21import java.io.PrintWriter;
22import java.io.StringWriter;
23
24/**
25 * API for sending log output.
26 *
27 * <p>Generally, use the Log.v() Log.d() Log.i() Log.w() and Log.e()
28 * methods.
29 *
30 * <p>The order in terms of verbosity, from least to most is
31 * ERROR, WARN, INFO, DEBUG, VERBOSE.  Verbose should never be compiled
32 * into an application except during development.  Debug logs are compiled
33 * in but stripped at runtime.  Error, warning and info logs are always kept.
34 *
35 * <p><b>Tip:</b> A good convention is to declare a <code>TAG</code> constant
36 * in your class:
37 *
38 * <pre>private static final String TAG = "MyActivity";</pre>
39 *
40 * and use that in subsequent calls to the log methods.
41 * </p>
42 *
43 * <p><b>Tip:</b> Don't forget that when you make a call like
44 * <pre>Log.v(TAG, "index=" + i);</pre>
45 * that when you're building the string to pass into Log.d, the compiler uses a
46 * StringBuilder and at least three allocations occur: the StringBuilder
47 * itself, the buffer, and the String object.  Realistically, there is also
48 * another buffer allocation and copy, and even more pressure on the gc.
49 * That means that if your log message is filtered out, you might be doing
50 * significant work and incurring significant overhead.
51 */
52public final class Log {
53
54    /**
55     * Priority constant for the println method; use Log.v.
56     */
57    public static final int VERBOSE = 2;
58
59    /**
60     * Priority constant for the println method; use Log.d.
61     */
62    public static final int DEBUG = 3;
63
64    /**
65     * Priority constant for the println method; use Log.i.
66     */
67    public static final int INFO = 4;
68
69    /**
70     * Priority constant for the println method; use Log.w.
71     */
72    public static final int WARN = 5;
73
74    /**
75     * Priority constant for the println method; use Log.e.
76     */
77    public static final int ERROR = 6;
78
79    /**
80     * Priority constant for the println method.
81     */
82    public static final int ASSERT = 7;
83
84    private Log() {
85    }
86
87    /**
88     * Send a {@link #VERBOSE} log message.
89     * @param tag Used to identify the source of a log message.  It usually identfies
90     *        the class or activity where the log call occurs.
91     * @param msg The message you would like logged.
92     */
93    public static int v(String tag, String msg) {
94        return println(VERBOSE, tag, msg);
95    }
96
97    /**
98     * Send a {@link #VERBOSE} log message and log the exception.
99     * @param tag Used to identify the source of a log message.  It usually identfies
100     *        the class or activity where the log call occurs.
101     * @param msg The message you would like logged.
102     * @param tr An exception to log
103     */
104    public static int v(String tag, String msg, Throwable tr) {
105        return println(VERBOSE, tag, msg + '\n' + getStackTraceString(tr));
106    }
107
108    /**
109     * Send a {@link #DEBUG} log message.
110     * @param tag Used to identify the source of a log message.  It usually identfies
111     *        the class or activity where the log call occurs.
112     * @param msg The message you would like logged.
113     */
114    public static int d(String tag, String msg) {
115        return println(DEBUG, tag, msg);
116    }
117
118    /**
119     * Send a {@link #DEBUG} log message and log the exception.
120     * @param tag Used to identify the source of a log message.  It usually identfies
121     *        the class or activity where the log call occurs.
122     * @param msg The message you would like logged.
123     * @param tr An exception to log
124     */
125    public static int d(String tag, String msg, Throwable tr) {
126        return println(DEBUG, tag, msg + '\n' + getStackTraceString(tr));
127    }
128
129    /**
130     * Send an {@link #INFO} log message.
131     * @param tag Used to identify the source of a log message.  It usually identfies
132     *        the class or activity where the log call occurs.
133     * @param msg The message you would like logged.
134     */
135    public static int i(String tag, String msg) {
136        return println(INFO, tag, msg);
137    }
138
139    /**
140     * Send a {@link #INFO} log message and log the exception.
141     * @param tag Used to identify the source of a log message.  It usually identfies
142     *        the class or activity where the log call occurs.
143     * @param msg The message you would like logged.
144     * @param tr An exception to log
145     */
146    public static int i(String tag, String msg, Throwable tr) {
147        return println(INFO, tag, msg + '\n' + getStackTraceString(tr));
148    }
149
150    /**
151     * Send a {@link #WARN} log message.
152     * @param tag Used to identify the source of a log message.  It usually identfies
153     *        the class or activity where the log call occurs.
154     * @param msg The message you would like logged.
155     */
156    public static int w(String tag, String msg) {
157        return println(WARN, tag, msg);
158    }
159
160    /**
161     * Send a {@link #WARN} log message and log the exception.
162     * @param tag Used to identify the source of a log message.  It usually identfies
163     *        the class or activity where the log call occurs.
164     * @param msg The message you would like logged.
165     * @param tr An exception to log
166     */
167    public static int w(String tag, String msg, Throwable tr) {
168        return println(WARN, tag, msg + '\n' + getStackTraceString(tr));
169    }
170
171    /**
172     * Checks to see whether or not a log for the specified tag is loggable at the specified level.
173     *
174     *  The default level of any tag is set to INFO. This means that any level above and including
175     *  INFO will be logged. Before you make any calls to a logging method you should check to see
176     *  if your tag should be logged. You can change the default level by setting a system property:
177     *      'setprop log.tag.&lt;YOUR_LOG_TAG> &lt;LEVEL>'
178     *  Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPRESS will
179     *  turn off all logging for your tag. You can also create a local.prop file that with the
180     *  following in it:
181     *      'log.tag.&lt;YOUR_LOG_TAG>=&lt;LEVEL>'
182     *  and place that in /data/local.prop.
183     *
184     * @param tag The tag to check.
185     * @param level The level to check.
186     * @return Whether or not that this is allowed to be logged.
187     * @throws IllegalArgumentException is thrown if the tag.length() > 23.
188     */
189    public static native boolean isLoggable(String tag, int level);
190
191    /*
192     * Send a {@link #WARN} log message and log the exception.
193     * @param tag Used to identify the source of a log message.  It usually identfies
194     *        the class or activity where the log call occurs.
195     * @param tr An exception to log
196     */
197    public static int w(String tag, Throwable tr) {
198        return println(WARN, tag, getStackTraceString(tr));
199    }
200
201    /**
202     * Send an {@link #ERROR} log message.
203     * @param tag Used to identify the source of a log message.  It usually identfies
204     *        the class or activity where the log call occurs.
205     * @param msg The message you would like logged.
206     */
207    public static int e(String tag, String msg) {
208        return println(ERROR, tag, msg);
209    }
210
211    /**
212     * Send a {@link #ERROR} log message and log the exception.
213     * @param tag Used to identify the source of a log message.  It usually identfies
214     *        the class or activity where the log call occurs.
215     * @param msg The message you would like logged.
216     * @param tr An exception to log
217     */
218    public static int e(String tag, String msg, Throwable tr) {
219        int r = println(ERROR, tag, msg + '\n' + getStackTraceString(tr));
220        RuntimeInit.reportException(tag, tr, false);  // asynchronous
221        return r;
222    }
223
224    /**
225     * Handy function to get a loggable stack trace from a Throwable
226     * @param tr An exception to log
227     */
228    public static String getStackTraceString(Throwable tr) {
229        if (tr == null) {
230            return "";
231        }
232        StringWriter sw = new StringWriter();
233        PrintWriter pw = new PrintWriter(sw);
234        tr.printStackTrace(pw);
235        return sw.toString();
236    }
237
238    /**
239     * Low-level logging call.
240     * @param priority The priority/type of this log message
241     * @param tag Used to identify the source of a log message.  It usually identfies
242     *        the class or activity where the log call occurs.
243     * @param msg The message you would like logged.
244     * @return The number of bytes written.
245     */
246    public static native int println(int priority, String tag, String msg);
247}
248