In the process of program development, log is a widely used mechanism for recording program execution, which can be used for both program debugging and event recording in product operations. The Android system provides a simple, convenient log mechanism that developers can use easily. In this article, we briefly describe how to use and view logs in the Android kernel space and user space.
The use of log during kernel development. The Android kernel is based on Linux Kerne 2.36, so the Linux kernel log mechanism is also suitable for the Android kernel, which is known as PRINTK, and the C language of printf. Like printf, PRINTK provides formatted input functionality, and it also features all log mechanisms-providing logging-level filtering. PRINTK provides 8 logging levels (<linux/kernel.h>):
#define Kern_emerg "<0>"/ * system is unusable */
#define KERN_ALERT "<1>"/ * action must be Taken immediately * * *
#define KERN_CRIT "<2>"/ * Critical conditions/
#deinfe kern_err "<3 > "/ * ERROR conditions * * *
#deinfe kern_warning" <4> "/ * WARNING conditions
* * #deinfe kern_notice "<5>"/ * Normal but significant condition * * *
#deinfe kern_info "<6>"/ * Informational * *
#deinfe kern_debug "<7>"/ * Debug-level messages
How to use PRINTK:
PRINTK (Kern_alert "This are the log printed by PRINTK into Linux kernel space.");
Kern_alert represents the log level, followed by the formatting of the string.
In the Android system, the PRINTK output log information is stored in the/proc/kmsg, to view the contents of the/proc/kmsg, to download the Android kernel source in Ubuntu, compile, install a text, run the simulator in the background:
user-name@machine-name:~/android$ Emulator &
To start the ADB shell tool:
user-name@machine-name:~/android$ adb Shell
To view/proc/kmsg files:
Root@android:/# cat/proc/kmsg
two. The use of log during the development of user space programs. The Android system provides a lightweight logger log system in user space, a device driver that is implemented in the kernel, and is used in conjunction with the LOGCAT tools of user space to easily track the debugger. In the Android system, there are two different logger access interfaces for both C + + and the Java language respectively. C + + Log interfaces are typically used when writing hardware abstraction layer modules or writing JNI methods, while Java interfaces are typically used when writing apps in the application tier.
The C + + log interface in the Android system is used by macros. The level of the log is defined in System/core/include/android/log.h:
* * Android Log priority values, in ascending priority order.
* *
typedef enum Android_logpriority {
android_log_unknown = 0,
android_log_default,/* only for Setminpriority () * * *
android_log_verbose,
android_log_debug,
android_log_info,
Android_log_warn,
Android_log_error,
Android_log_fatal,
android_log_silent,/* Only for setminpriority (); must is last * *
In System/core/include/cutils/log.h, the corresponding macros are defined, such as the macro LOGV corresponding to Android_log_verbose:
* * This is the local tag used for the following simplified * logging macros.
You can change this preprocessor definition * before using the "other macros" to "change the" tag. * * #ifndef log_tag #define LOG_TAG NULL #endif/* Simplified macro to send a verbose LOG message using the Curre
NT Log_tag. * * #ifndef LOGV #if log_ndebug #define LOGV (...) ((void) 0) #else #define LOGV (...)
(void) log (Log_verbose, Log_tag, __va_args__) #endif #endif/* Basic LOG message macro.
* * Example: * LOG (Log_warn, NULL, "Failed with Error%d", errno);
* The second argument may is NULL or "" to indicate the "global" tag. * * #ifndef Log #define LOG (priority, tag, ...) \ Log_pri (android_# #priority, Tag, __va_args__) #endif * * Log
Macro that allows the Specify a number for priority.
* * #ifndef LOG_PRI #define LOG_PRI (priority, tag, ...) \ Android_printlog (priority, tag, __va_args__) #endif/* * ================================================================ * * The stuff in the rest of this file should is used directly. * * #define ANDROID_PRINTLOG (prio, tag, fmt ...) \ __android_log_print (prio, tag, FMT)
Therefore, if you want to use the C + + log interface, you can simply define your own Log_tag macros and include header files System/core/include/cutils/log.h:
#define LOG_TAG "My LOG TAG"
#include <cutils/log.h>
You can, for example, use LOGV:
LOGV ("This are the log printed by LOGV on Android user space.");
Look at the Java log interface in the Android system. The Android system defines the log interface in the frameworks layer:
(Frameworks/base/core/java/android/util/log.java):
..... ....... ...... ...... ..... ...... ...... ..... ..... ... 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; ..... ....... ...... ..... ..... ...... ..... ..... ..... ..... ..... ... public static int V (string tag, string msg) {return println_
Native (Log_id_main, VERBOSE, Tag, msg); public static int V (string tag, string msg, THRowable tr) {return println_native (Log_id_main, VERBOSE, tag, msg + ' \ n ' + getstacktracestring (tr));
public static int D (string tags, string msg) {return println_native (Log_id_main, DEBUG, Tag, msg); public static int D (string tags, string msg, Throwable tr) {return println_native (Log_id_main, DEBUG, tag, MSG +
' \ n ' + getstacktracestring (TR);
public static int I (string tags, string msg) {return println_native (Log_id_main, INFO, Tag, msg); public static int I (string tags, string msg, Throwable tr) {return println_native (Log_id_main, INFO, tag, msg + ')
\ n ' + getstacktracestring (tr));
public static int W (string tags, string msg) {return println_native (Log_id_main, WARN, Tag, msg); public static int W (string tags, string msg, Throwable tr) {return println_native (Log_id_main, WARN, tag, msg + ')
\ n ' + getstacktracestring (tr)); public static int W (String tag, Throwable tr) {return println_native (Log_id_main, WARN, Tag, getstacktracestring (tr));
public static int E (string tag, string msg) {return println_native (Log_id_main, ERROR, Tag, msg); public static int E (string tags, string msg, Throwable tr) {return println_native (Log_id_main, ERROR, tag, MSG +
' \ n ' + getstacktracestring (TR); }
..................................................................
Therefore, if you want to use the Java log interface, as long as the Log_tag constants and references defined in the class are android.util.Log:
private static final String Log_tag = "My_log_tag";
LOG.I (Log_tag, "This are the LOG printed by LOG.I in Android user spaces.");
To see the output of these logs, you can match the Logcat tool. If you're running an emulator in an eclipse environment and you've installed the Android plugin, it's easy to see directly in Eclipse:
If you are using it in your own compiled Android source project, run the emulator in the background:
user-name@machine-name:~/android$ Emulator &
To start the ADB shell tool:
user-name@machine-name:~/android$ adb Shell
To view logs using the Logcat command:
Root@android:/# Logcat
This will allow you to see the log of the output.
The above is the Android own log information implementation method, the need for friends to look down.