| LIBLOG(3)          Android Internal NDK Programming Manual           LIBLOG(3) | 
 |  | 
 |  | 
 |  | 
 | NAME | 
 |        liblog - Android Internal NDK logger interfaces | 
 |  | 
 | SYNOPSIS | 
 |        /* | 
 |         * Please limit to 24 characters for runtime is loggable, | 
 |         * 16 characters for persist is loggable, and logcat pretty | 
 |         * alignment with limit of 7 characters. | 
 |         */ | 
 |        #define LOG_TAG "yourtag" | 
 |        #include <log/log.h> | 
 |  | 
 |        ALOG(android_priority, tag, format, ...) | 
 |        IF_ALOG(android_priority, tag) | 
 |        LOG_PRI(priority, tag, format, ...) | 
 |        LOG_PRI_VA(priority, tag, format, args) | 
 |        #define LOG_TAG NULL | 
 |        ALOGV(format, ...) | 
 |        SLOGV(format, ...) | 
 |        RLOGV(format, ...) | 
 |        ALOGV_IF(cond, format, ...) | 
 |        SLOGV_IF(cond, format, ...) | 
 |        RLOGV_IF(cond, format, ...) | 
 |        IF_ALOGC() | 
 |        ALOGD(format, ...) | 
 |        SLOGD(format, ...) | 
 |        RLOGD(format, ...) | 
 |        ALOGD_IF(cond, format, ...) | 
 |        SLOGD_IF(cond, format, ...) | 
 |        RLOGD_IF(cond, format, ...) | 
 |        IF_ALOGD() | 
 |        ALOGI(format, ...) | 
 |        SLOGI(format, ...) | 
 |        RLOGI(format, ...) | 
 |        ALOGI_IF(cond, format, ...) | 
 |        SLOGI_IF(cond, format, ...) | 
 |        RLOGI_IF(cond, format, ...) | 
 |        IF_ALOGI() | 
 |        ALOGW(format, ...) | 
 |        SLOGW(format, ...) | 
 |        RLOGW(format, ...) | 
 |        ALOGW_IF(cond, format, ...) | 
 |        SLOGW_IF(cond, format, ...) | 
 |        RLOGW_IF(cond, format, ...) | 
 |        IF_ALOGW() | 
 |        ALOGE(format, ...) | 
 |        SLOGE(format, ...) | 
 |        RLOGE(format, ...) | 
 |        ALOGE_IF(cond, format, ...) | 
 |        SLOGE_IF(cond, format, ...) | 
 |        RLOGE_IF(cond, format, ...) | 
 |        IF_ALOGE() | 
 |        LOG_FATAL(format, ...) | 
 |        LOG_ALWAYS_FATAL(format, ...) | 
 |        LOG_FATAL_IF(cond, format, ...) | 
 |        LOG_ALWAYS_FATAL_IF(cond, format, ...) | 
 |        ALOG_ASSERT(cond, format, ...) | 
 |        LOG_EVENT_INT(tag, value) | 
 |        LOG_EVENT_LONG(tag, value) | 
 |  | 
 |        clockid_t android_log_clockid() | 
 |  | 
 |        log_id_t android_logger_get_id(struct logger *logger) | 
 |        int android_logger_clear(struct logger *logger) | 
 |        int android_logger_get_log_size(struct logger *logger) | 
 |        int android_logger_get_log_readable_size(struct logger *logger) | 
 |        int android_logger_get_log_version(struct logger *logger) | 
 |  | 
 |        struct logger_list *android_logger_list_alloc(int mode, | 
 |                                                      unsigned int tail, | 
 |                                                      pid_t pid) | 
 |        struct logger *android_logger_open(struct logger_list *logger_list, | 
 |                                           log_id_t id) | 
 |        struct logger_list *android_logger_list_open(log_id_t id, int mode, | 
 |                                                     unsigned int tail, | 
 |                                                     pid_t pid) | 
 |        int android_logger_list_read(struct logger_list *logger_list, | 
 |                                     struct log_msg *log_msg) | 
 |        void android_logger_list_free(struct logger_list *logger_list) | 
 |  | 
 |        log_id_t android_name_to_log_id(const char *logName) | 
 |        const char *android_log_id_to_name(log_id_t log_id) | 
 |  | 
 |        android_log_context create_android_logger(uint32_t tag) | 
 |  | 
 |        int android_log_write_list_begin(android_log_context ctx) | 
 |        int android_log_write_list_end(android_log_context ctx) | 
 |  | 
 |        int android_log_write_int32(android_log_context ctx, int32_t value) | 
 |        int android_log_write_int64(android_log_context ctx, int64_t value) | 
 |        int android_log_write_string8(android_log_context ctx, | 
 |                                      const char *value) | 
 |        int android_log_write_string8_len(android_log_context ctx, | 
 |                                          const char *value, size_t maxlen) | 
 |        int android_log_write_float32(android_log_context ctx, float value) | 
 |  | 
 |        int android_log_write_list(android_log_context ctx, | 
 |                                   log_id_t id = LOG_ID_EVENTS) | 
 |  | 
 |        android_log_context create_android_log_parser(const char *msg, | 
 |                                                      size_t len) | 
 |        android_log_list_element android_log_read_next(android_log_context ctx) | 
 |        android_log_list_element android_log_peek_next(android_log_context ctx) | 
 |  | 
 |        int android_log_destroy(android_log_context *ctx) | 
 |  | 
 |        #include <log/log_transport.h> | 
 |  | 
 |        int android_set_log_transport(int transport_flag) | 
 |        int android_get_log_transport() | 
 |  | 
 |        Link with -llog | 
 |  | 
 | DESCRIPTION | 
 |        liblog  represents  an interface to the volatile Android Logging system | 
 |        for NDK (Native) applications  and  libraries.  Interfaces  for  either | 
 |        writing  or reading logs.  The log buffers are divided up in Main, Sys‐ | 
 |        tem, Radio and Events sub-logs. | 
 |  | 
 |        The logging interfaces are a series of macros,  all  of  which  can  be | 
 |        overridden individually in order to control the verbosity of the appli‐ | 
 |        cation or library.  [ASR]LOG[VDIWE] calls are used  to  log  to  BAsic, | 
 |        System or Radio sub-logs in either the Verbose, Debug, Info, Warning or | 
 |        Error priorities.  [ASR]LOG[VDIWE]_IF calls are used  to  perform  thus | 
 |        based  on a condition being true.  IF_ALOG[VDIWE] calls are true if the | 
 |        current LOG_TAG is enabled at the specified priority.  LOG_ALWAYS_FATAL | 
 |        is  used to ALOG a message, then kill the process.  LOG_FATAL call is a | 
 |        variant of LOG_ALWAYS_FATAL,  only  enabled  in  engineering,  and  not | 
 |        release builds.  ALOG_ASSERT is used to ALOG a message if the condition | 
 |        is  false;   the   condition   is   part   of   the   logged   message. | 
 |        LOG_EVENT_(INT|LONG)  is  used  to  drop binary content into the Events | 
 |        sub-log. | 
 |  | 
 |        The log reading interfaces permit opening the  logs  either  singly  or | 
 |        multiply,  retrieving  a  log  entry  at  a  time in time sorted order, | 
 |        optionally limited to a specific pid and tail of the log(s) and finally | 
 |        a  call closing the logs.  A single log can be opened with android_log‐ | 
 |        ger_list_open;  or  multiple  logs  can  be  opened  with  android_log‐ | 
 |        ger_list_alloc,  calling  in  turn the android_logger_open for each log | 
 |        id.  Each entry can be retrieved  with  android_logger_list_read.   The | 
 |        log(s) can be closed with android_logger_list_free.  The logs should be | 
 |        opened  with an  ANDROID_LOG_RDONLY  mode.   ANDROID_LOG_NONBLOCK  mode | 
 |        will report when the  log reading is done with an  EAGAIN  error return | 
 |        code,  otherwise the  android_logger_list_read  call will block for new | 
 |        entries. | 
 |  | 
 |        The  ANDROID_LOG_WRAP  mode flag to the  android_logger_list_alloc_time | 
 |        signals  logd to quiesce  the reader until the buffer is about to prune | 
 |        at the start time then proceed to dumping content. | 
 |  | 
 |        The  ANDROID_LOG_PSTORE mode flag to the android_logger_open is used to | 
 |        switch from the active logs to the persistent logs from before the last | 
 |        reboot. | 
 |  | 
 |        The value returned by android_logger_open can be used as a parameter to | 
 |        the  android_logger_clear  function to empty the sub-log.  It is recom‐ | 
 |        mended to only open log ANDROID_LOG_WRONLY in that case. | 
 |  | 
 |        The value returned by android_logger_open can be used as a parameter to | 
 |        the android_logger_get_log_(size|readable_size|version) to retrieve the | 
 |        sub-log maximum size, readable size and log buffer format protocol ver‐ | 
 |        sion  respectively.  android_logger_get_id returns the id that was used | 
 |        when  opening  the  sub-log.    It  is  recommended  to  open  the  log | 
 |        ANDROID_LOG_RDONLY in these cases. | 
 |  | 
 |        android_set_log_transport()  selects  transport  filters.  Argument  is | 
 |        either LOGGER_DEFAULT, LOGGER_LOGD, LOGGER_NULL or LOGGER_LOCAL. Log to | 
 |        logger daemon for default or logd, drop contents on floor,  or log into | 
 |        local   memory   respectively.       Both   android_set_log_transport() | 
 |        and android_get_log_transport() return the current  transport mask,  or | 
 |        a negative errno for any problems. | 
 |  | 
 | ERRORS | 
 |        If messages fail, a negative error code will be returned to the caller. | 
 |  | 
 |        The -ENOTCONN return code indicates that the logger daemon is stopped. | 
 |  | 
 |        The  -EBADF return code indicates that the log access point can not be | 
 |        opened, or the log buffer id is out of range. | 
 |  | 
 |        For the  -EAGAIN  return code,  this means that the logging message was | 
 |        temporarily backed-up either because of Denial Of Service (DOS) logging | 
 |        pressure from some chatty application or service in the Android system, | 
 |        or if too small of a value is set in /proc/sys/net/unix/max_dgram_qlen. | 
 |        To aid in diagnosing the occurence of this,  a binary event from liblog | 
 |        will be sent to the  log  daemon  once a  new  message  can get through | 
 |        indicating how many  messages were  dropped  as a result.   Please take | 
 |        action to resolve the structural problems at the source. | 
 |  | 
 |        It is generally not advised for the caller to retry the  -EAGAIN return | 
 |        code as  this  will  only  make the  problem(s)  worse  and  cause your | 
 |        application to temporarily drop to the  logger daemon  priority,  BATCH | 
 |        scheduling policy and background task cgroup. If you require a group of | 
 |        messages to be passed atomically,  merge  them  into  one  message with | 
 |        embedded newlines to the maximum length LOGGER_ENTRY_MAX_PAYLOAD. | 
 |  | 
 |        Other return codes  from  writing operation can be returned.  Since the | 
 |        library retries on EINTR, -EINTR should never be returned. | 
 |  | 
 | SEE ALSO | 
 |        syslogd(8), klogd, auditd(8) | 
 |  | 
 |  | 
 |  | 
 |                                   08 Feb 2017                        LIBLOG(3) |