1*598139dcSAndroid Build Coastguard WorkerAndroid liblog 2*598139dcSAndroid Build Coastguard Worker-------------- 3*598139dcSAndroid Build Coastguard Worker 4*598139dcSAndroid Build Coastguard WorkerPublic Functions and Macros 5*598139dcSAndroid Build Coastguard Worker--------------------------- 6*598139dcSAndroid Build Coastguard Worker 7*598139dcSAndroid Build Coastguard Worker /* 8*598139dcSAndroid Build Coastguard Worker * Please limit to 24 characters for runtime is loggable, 9*598139dcSAndroid Build Coastguard Worker * 16 characters for persist is loggable, and logcat pretty 10*598139dcSAndroid Build Coastguard Worker * alignment with limit of 7 characters. 11*598139dcSAndroid Build Coastguard Worker */ 12*598139dcSAndroid Build Coastguard Worker #define LOG_TAG "yourtag" 13*598139dcSAndroid Build Coastguard Worker #include <log/log.h> 14*598139dcSAndroid Build Coastguard Worker 15*598139dcSAndroid Build Coastguard Worker ALOG(android_priority, tag, format, ...) 16*598139dcSAndroid Build Coastguard Worker IF_ALOG(android_priority, tag) 17*598139dcSAndroid Build Coastguard Worker LOG_PRI(priority, tag, format, ...) 18*598139dcSAndroid Build Coastguard Worker LOG_PRI_VA(priority, tag, format, args) 19*598139dcSAndroid Build Coastguard Worker #define LOG_TAG NULL 20*598139dcSAndroid Build Coastguard Worker ALOGV(format, ...) 21*598139dcSAndroid Build Coastguard Worker SLOGV(format, ...) 22*598139dcSAndroid Build Coastguard Worker RLOGV(format, ...) 23*598139dcSAndroid Build Coastguard Worker ALOGV_IF(cond, format, ...) 24*598139dcSAndroid Build Coastguard Worker SLOGV_IF(cond, format, ...) 25*598139dcSAndroid Build Coastguard Worker RLOGV_IF(cond, format, ...) 26*598139dcSAndroid Build Coastguard Worker IF_ALOGC() 27*598139dcSAndroid Build Coastguard Worker ALOGD(format, ...) 28*598139dcSAndroid Build Coastguard Worker SLOGD(format, ...) 29*598139dcSAndroid Build Coastguard Worker RLOGD(format, ...) 30*598139dcSAndroid Build Coastguard Worker ALOGD_IF(cond, format, ...) 31*598139dcSAndroid Build Coastguard Worker SLOGD_IF(cond, format, ...) 32*598139dcSAndroid Build Coastguard Worker RLOGD_IF(cond, format, ...) 33*598139dcSAndroid Build Coastguard Worker IF_ALOGD() 34*598139dcSAndroid Build Coastguard Worker ALOGI(format, ...) 35*598139dcSAndroid Build Coastguard Worker SLOGI(format, ...) 36*598139dcSAndroid Build Coastguard Worker RLOGI(format, ...) 37*598139dcSAndroid Build Coastguard Worker ALOGI_IF(cond, format, ...) 38*598139dcSAndroid Build Coastguard Worker SLOGI_IF(cond, format, ...) 39*598139dcSAndroid Build Coastguard Worker RLOGI_IF(cond, format, ...) 40*598139dcSAndroid Build Coastguard Worker IF_ALOGI() 41*598139dcSAndroid Build Coastguard Worker ALOGW(format, ...) 42*598139dcSAndroid Build Coastguard Worker SLOGW(format, ...) 43*598139dcSAndroid Build Coastguard Worker RLOGW(format, ...) 44*598139dcSAndroid Build Coastguard Worker ALOGW_IF(cond, format, ...) 45*598139dcSAndroid Build Coastguard Worker SLOGW_IF(cond, format, ...) 46*598139dcSAndroid Build Coastguard Worker RLOGW_IF(cond, format, ...) 47*598139dcSAndroid Build Coastguard Worker IF_ALOGW() 48*598139dcSAndroid Build Coastguard Worker ALOGE(format, ...) 49*598139dcSAndroid Build Coastguard Worker SLOGE(format, ...) 50*598139dcSAndroid Build Coastguard Worker RLOGE(format, ...) 51*598139dcSAndroid Build Coastguard Worker ALOGE_IF(cond, format, ...) 52*598139dcSAndroid Build Coastguard Worker SLOGE_IF(cond, format, ...) 53*598139dcSAndroid Build Coastguard Worker RLOGE_IF(cond, format, ...) 54*598139dcSAndroid Build Coastguard Worker IF_ALOGE() 55*598139dcSAndroid Build Coastguard Worker LOG_FATAL(format, ...) 56*598139dcSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL(format, ...) 57*598139dcSAndroid Build Coastguard Worker LOG_FATAL_IF(cond, format, ...) 58*598139dcSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(cond, format, ...) 59*598139dcSAndroid Build Coastguard Worker ALOG_ASSERT(cond, format, ...) 60*598139dcSAndroid Build Coastguard Worker LOG_EVENT_INT(tag, value) 61*598139dcSAndroid Build Coastguard Worker LOG_EVENT_LONG(tag, value) 62*598139dcSAndroid Build Coastguard Worker 63*598139dcSAndroid Build Coastguard Worker log_id_t android_logger_get_id(struct logger *logger) 64*598139dcSAndroid Build Coastguard Worker int android_logger_clear(struct logger *logger) 65*598139dcSAndroid Build Coastguard Worker int android_logger_get_log_size(struct logger *logger) 66*598139dcSAndroid Build Coastguard Worker int android_logger_get_log_readable_size(struct logger *logger) 67*598139dcSAndroid Build Coastguard Worker int android_logger_get_log_version(struct logger *logger) 68*598139dcSAndroid Build Coastguard Worker 69*598139dcSAndroid Build Coastguard Worker struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) 70*598139dcSAndroid Build Coastguard Worker struct logger *android_logger_open(struct logger_list *logger_list, log_id_t id) 71*598139dcSAndroid Build Coastguard Worker struct logger_list *android_logger_list_open(log_id_t id, int mode, unsigned int tail, pid_t pid) 72*598139dcSAndroid Build Coastguard Worker int android_logger_list_read(struct logger_list *logger_list, struct log_msg *log_msg) 73*598139dcSAndroid Build Coastguard Worker void android_logger_list_free(struct logger_list *logger_list) 74*598139dcSAndroid Build Coastguard Worker 75*598139dcSAndroid Build Coastguard Worker log_id_t android_name_to_log_id(const char *logName) 76*598139dcSAndroid Build Coastguard Worker const char *android_log_id_to_name(log_id_t log_id) 77*598139dcSAndroid Build Coastguard Worker 78*598139dcSAndroid Build Coastguard Worker android_log_context create_android_logger(uint32_t tag) 79*598139dcSAndroid Build Coastguard Worker 80*598139dcSAndroid Build Coastguard Worker int android_log_write_list_begin(android_log_context ctx) 81*598139dcSAndroid Build Coastguard Worker int android_log_write_list_end(android_log_context ctx) 82*598139dcSAndroid Build Coastguard Worker 83*598139dcSAndroid Build Coastguard Worker int android_log_write_int32(android_log_context ctx, int32_t value) 84*598139dcSAndroid Build Coastguard Worker int android_log_write_int64(android_log_context ctx, int64_t value) 85*598139dcSAndroid Build Coastguard Worker int android_log_write_string8(android_log_context ctx, const char *value) 86*598139dcSAndroid Build Coastguard Worker int android_log_write_string8_len(android_log_context ctx, const char *value, size_t maxlen) 87*598139dcSAndroid Build Coastguard Worker int android_log_write_float32(android_log_context ctx, float value) 88*598139dcSAndroid Build Coastguard Worker 89*598139dcSAndroid Build Coastguard Worker int android_log_write_list(android_log_context ctx, log_id_t id = LOG_ID_EVENTS) 90*598139dcSAndroid Build Coastguard Worker 91*598139dcSAndroid Build Coastguard Worker android_log_context create_android_log_parser(const char *msg, size_t len) 92*598139dcSAndroid Build Coastguard Worker android_log_list_element android_log_read_next(android_log_context ctx) 93*598139dcSAndroid Build Coastguard Worker android_log_list_element android_log_peek_next(android_log_context ctx) 94*598139dcSAndroid Build Coastguard Worker 95*598139dcSAndroid Build Coastguard Worker int android_log_destroy(android_log_context *ctx) 96*598139dcSAndroid Build Coastguard Worker 97*598139dcSAndroid Build Coastguard WorkerDescription 98*598139dcSAndroid Build Coastguard Worker----------- 99*598139dcSAndroid Build Coastguard Worker 100*598139dcSAndroid Build Coastguard Workerliblog represents an interface to the volatile Android Logging system for NDK (Native) applications 101*598139dcSAndroid Build Coastguard Workerand libraries. Interfaces for either writing or reading logs. The log buffers are divided up in 102*598139dcSAndroid Build Coastguard WorkerMain, System, Radio and Events sub-logs. 103*598139dcSAndroid Build Coastguard Worker 104*598139dcSAndroid Build Coastguard WorkerThe logging interfaces are a series of macros, all of which can be overridden individually in order 105*598139dcSAndroid Build Coastguard Workerto control the verbosity of the application or library. `[ASR]LOG[VDIWE]` calls are used to log to 106*598139dcSAndroid Build Coastguard WorkerBasic, System or Radio sub-logs in either the Verbose, Debug, Info, Warning or Error priorities. 107*598139dcSAndroid Build Coastguard Worker`[ASR]LOG[VDIWE]_IF` calls are used to perform thus based on a condition being true. 108*598139dcSAndroid Build Coastguard Worker`IF_ALOG[VDIWE]` calls are true if the current `LOG_TAG` is enabled at the specified priority. 109*598139dcSAndroid Build Coastguard Worker`LOG_ALWAYS_FATAL` is used to `ALOG` a message, then kill the process. `LOG_FATAL` call is a 110*598139dcSAndroid Build Coastguard Workervariant of `LOG_ALWAYS_FATAL`, only enabled in engineering, and not release builds. `ALOG_ASSERT` 111*598139dcSAndroid Build Coastguard Workeris used to `ALOG` a message if the condition is false; the condition is part of the logged message. 112*598139dcSAndroid Build Coastguard Worker`LOG_EVENT_(INT|LONG)` is used to drop binary content into the Events sub-log. 113*598139dcSAndroid Build Coastguard Worker 114*598139dcSAndroid Build Coastguard WorkerThe log reading interfaces permit opening the logs either singly or multiply, retrieving a log entry 115*598139dcSAndroid Build Coastguard Workerat a time in time sorted order, optionally limited to a specific pid and tail of the log(s) and 116*598139dcSAndroid Build Coastguard Workerfinally a call closing the logs. A single log can be opened with `android_logger_list_open()`; or 117*598139dcSAndroid Build Coastguard Workermultiple logs can be opened with `android_logger_list_alloc()`, calling in turn the 118*598139dcSAndroid Build Coastguard Worker`android_logger_open()` for each log id. Each entry can be retrieved with 119*598139dcSAndroid Build Coastguard Worker`android_logger_list_read()`. The log(s) can be closed with `android_logger_list_free()`. 120*598139dcSAndroid Build Coastguard Worker`ANDROID_LOG_NONBLOCK` mode will report when the log reading is done with an `EAGAIN` error return 121*598139dcSAndroid Build Coastguard Workercode, otherwise the `android_logger_list_read()` call will block for new entries. 122*598139dcSAndroid Build Coastguard Worker 123*598139dcSAndroid Build Coastguard WorkerThe `ANDROID_LOG_WRAP` mode flag to the `android_logger_list_alloc_time()` signals logd to quiesce 124*598139dcSAndroid Build Coastguard Workerthe reader until the buffer is about to prune at the start time then proceed to dumping content. 125*598139dcSAndroid Build Coastguard Worker 126*598139dcSAndroid Build Coastguard WorkerThe `ANDROID_LOG_PSTORE` mode flag to the `android_logger_open()` is used to switch from the active 127*598139dcSAndroid Build Coastguard Workerlogs to the persistent logs from before the last reboot. 128*598139dcSAndroid Build Coastguard Worker 129*598139dcSAndroid Build Coastguard WorkerThe value returned by `android_logger_open()` can be used as a parameter to the 130*598139dcSAndroid Build Coastguard Worker`android_logger_clear()` function to empty the sub-log. 131*598139dcSAndroid Build Coastguard Worker 132*598139dcSAndroid Build Coastguard WorkerThe value returned by `android_logger_open()` can be used as a parameter to the 133*598139dcSAndroid Build Coastguard Worker`android_logger_get_log_(size|readable_size|version)` to retrieve the sub-log maximum size, readable 134*598139dcSAndroid Build Coastguard Workersize and log buffer format protocol version respectively. `android_logger_get_id()` returns the id 135*598139dcSAndroid Build Coastguard Workerthat was used when opening the sub-log. 136*598139dcSAndroid Build Coastguard Worker 137*598139dcSAndroid Build Coastguard WorkerErrors 138*598139dcSAndroid Build Coastguard Worker------ 139*598139dcSAndroid Build Coastguard Worker 140*598139dcSAndroid Build Coastguard WorkerIf messages fail, a negative error code will be returned to the caller. 141*598139dcSAndroid Build Coastguard Worker 142*598139dcSAndroid Build Coastguard WorkerThe `-ENOTCONN` return code indicates that the logger daemon is stopped. 143*598139dcSAndroid Build Coastguard Worker 144*598139dcSAndroid Build Coastguard WorkerThe `-EBADF` return code indicates that the log access point can not be opened, or the log buffer id 145*598139dcSAndroid Build Coastguard Workeris out of range. 146*598139dcSAndroid Build Coastguard Worker 147*598139dcSAndroid Build Coastguard WorkerFor the `-EAGAIN` return code, this means that the logging message was temporarily backed-up either 148*598139dcSAndroid Build Coastguard Workerbecause of Denial Of Service (DOS) logging pressure from some spammy application or service in the 149*598139dcSAndroid Build Coastguard WorkerAndroid system, or if too small of a value is set in /proc/sys/net/unix/max_dgram_qlen. To aid in 150*598139dcSAndroid Build Coastguard Workerdiagnosing the occurence of this, a binary event from liblog will be sent to the log daemon once a 151*598139dcSAndroid Build Coastguard Workernew message can get through indicating how many messages were dropped as a result. Please take 152*598139dcSAndroid Build Coastguard Workeraction to resolve the structural problems at the source. 153*598139dcSAndroid Build Coastguard Worker 154*598139dcSAndroid Build Coastguard WorkerIt is generally not advised for the caller to retry the `-EAGAIN` return code as this will only make 155*598139dcSAndroid Build Coastguard Workerthe problem(s) worse and cause your application to temporarily drop to the logger daemon priority, 156*598139dcSAndroid Build Coastguard WorkerBATCH scheduling policy and background task cgroup. If you require a group of messages to be passed 157*598139dcSAndroid Build Coastguard Workeratomically, merge them into one message with embedded newlines to the maximum length 158*598139dcSAndroid Build Coastguard Worker`LOGGER_ENTRY_MAX_PAYLOAD`. 159*598139dcSAndroid Build Coastguard Worker 160*598139dcSAndroid Build Coastguard WorkerOther return codes from writing operation can be returned. Since the library retries on `EINTR`, 161*598139dcSAndroid Build Coastguard Worker`-EINTR` should never be returned. 162