Android的log问题

#include <utils/Log.h>
#undef LOG_TAG
#define  LOG_TAG  "SKHDI"


#define SK_TRACE LOGI
#define SK_INFO_TX(fmt,args...)      ALOGI ("[%s,%d]: " fmt ,__FUNCTION__, __LINE__,##args)
#define SK_ERROR_TX(fmt,args...)    ALOGE(COLOUR_RED "[%s,%d]: " fmt COLOUR_NONE,__FUNCTION__, __LINE__,##args)
#define SK_DEBUG_TX(fmt,args...)    ALOGD("[%s,%d]: " fmt ,__FUNCTION__, __LINE__,##args)
#define SK_INFO(msg)  SK_INFO_TX msg
#define SK_ERROR(err_info)  SK_ERROR_TX err_info

./system/core/libutils/include/utils/Log.h
#include <sys/types.h>
#include <log/log.h>

./system/core/liblog/include/log/log.h

./system/core/liblog/include/log/log_main.h
#ifndef ALOGI
215 #define  ALOGI (...) ((void) ALOG ( LOG_INFO ,  LOG_TAG , __VA_ARGS__))
216 #endif

#ifndef ALOG
#define  ALOG (priority, tag, ...)  LOG_PRI (ANDROID_##priority, tag, __VA_ARGS__)
#endif

#ifndef LOG_PRI
71 #define  LOG_PRI (priority, tag, ...)  android_printLog (priority, tag, __VA_ARGS__)
72 #endif

#define  android_printLog (prio, tag, ...) \
   __android_log_print (prio, tag, __VA_ARGS__)



LIBLOG_ABI_PUBLIC int __android_log_print(int prio, const char* tag,
                                          const char* fmt, ...) {
  va_list ap;
  char buf[LOG_BUF_SIZE];
  va_start(ap, fmt);
  vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
  va_end(ap);
  return __android_log_write(prio, tag, buf);
}

LIBLOG_ABI_PUBLIC int __android_log_write(int prio, const char* tag,
                                          const char* msg) {
  return __android_log_buf_write(LOG_ID_MAIN, prio, tag, msg);
}

LIBLOG_ABI_PUBLIC int __android_log_buf_write(int bufID, int prio,
                                              const char* tag, const char* msg) {
...
vec[0].iov_base = (unsigned char*)&prio;
  vec[0].iov_len = 1;
  vec[1].iov_base = (void*)tag;
  vec[1].iov_len = strlen(tag) + 1;
  vec[2].iov_base = (void*)msg;
  vec[2].iov_len = strlen(msg) + 1;
  return  write_to_log (bufID, vec, 3);
}


static int (*write_to_log)(log_id_t, struct iovec* vec,
                           size_t nr) =  __write_to_log_init ;

static int __write_to_log_init(log_id_t log_id, struct iovec* vec, size_t nr) {
  __android_log_lock();
  if (write_to_log == __write_to_log_init) {   //表明未初始化
    int ret;
    ret = __write_to_log_initialize();
    if (ret < 0) {
      __android_log_unlock();
      if (!list_empty(&__android_log_persist_write)) {
        __write_to_log_daemon(log_id, vec, nr);
      }
      return ret;
    }
     write_to_log = __write_to_log_daemon ;
  }
  __android_log_unlock();
  return write_to_log(log_id, vec, nr);
}

LIBLOG_HIDDEN void __android_log_config_write() {
  if (__android_log_transport &  LOGGER_LOCAL ) {
    extern struct android_log_transport_write localLoggerWrite;
    __android_log_add_transport(&__android_log_transport_write,
                                &localLoggerWrite);
  }
  if ((__android_log_transport ==  LOGGER_DEFAULT ) ||
      (__android_log_transport &  LOGGER_LOGD )) {
#if (FAKE_LOG_DEVICE == 0)
    extern struct android_log_transport_write logdLoggerWrite;
    extern struct android_log_transport_write pmsgLoggerWrite;
    __android_log_add_transport(&__android_log_transport_write,
                                &logdLoggerWrite);
    __android_log_add_transport(&__android_log_persist_write, &pmsgLoggerWrite);
#else
    extern struct android_log_transport_write fakeLoggerWrite;
    __android_log_add_transport(&__android_log_transport_write,
                                &fakeLoggerWrite);
#endif
  }

if (__android_log_transport &  LOGGER_STDERR ) {
    extern struct android_log_transport_write stderrLoggerWrite;
    /*
     * stderr logger should be primary if we can be the only one, or if
     * already in the primary list.  Otherwise land in the persist list.
     * Remember we can be called here if we are already initialized.
     */
    if (list_empty(&__android_log_transport_write)) {
      __android_log_add_transport(&__android_log_transport_write,
                                  &stderrLoggerWrite);
    } else {
      struct android_log_transport_write* transp;
      write_transport_for_each(transp, &__android_log_transport_write) {
        if (transp == &stderrLoggerWrite) {
          return;
        }
      }
      __android_log_add_transport(&__android_log_persist_write,
                                  &stderrLoggerWrite);
    }
  }
}

#define LOGGER_DEFAULT 0x00  
所以默认是logdLoggerWrite

当然也可以改变,通过下面的函数:
LIBLOG_ABI_PUBLIC int  android_set_log_transport (int transport_flag) {
  int retval;
  if (transport_flag < 0) {
    return -EINVAL;
  }
  retval = LOGGER_NULL;
  __android_log_lock();
  if (transport_flag & LOGGER_NULL) {
    write_to_log = __write_to_log_null;
;?  __android_log_unlock();
  
    return retval;
  }
  __android_log_transport &= LOGGER_LOCAL | LOGGER_LOGD | LOGGER_STDERR;
  transport_flag &= LOGGER_LOCAL | LOGGER_LOGD | LOGGER_STDERR;
  if (__android_log_transport != transport_flag) {
    __android_log_transport = transport_flag;
    __android_log_config_write_close();
    __android_log_config_read_close();
    write_to_log = __write_to_log_init;
}

下面具体看看logdLoggerWrite的实现:
LIBLOG_HIDDEN struct android_log_transport_write logdLoggerWrite = {
  .node = { &logdLoggerWrite.node, &logdLoggerWrite.node },
  .context.sock = -EBADF,
  .name = "logd",
  .available = logdAvailable,
  .open = logdOpen,
  .close = logdClose,
  .write =  logdWrite ,
};

static int logdAvailable(log_id_t logId) {
  if (logId >= LOG_ID_MAX || logId == LOG_ID_KERNEL) {
    return -EINVAL;
  }
  if (atomic_load(&logdLoggerWrite.context.sock) < 0) {
    if (access(" /dev/socket/logdw ", W_OK) == 0) {
      return 0;
    }
    return -EBADF;
  }
  return 1;
}

LOCAL_MODULE := logcat
LOCAL_SRC_FILES := logcat_main.cpp event.logtags
LOCAL_SHARED_LIBRARIES := liblogcat $(logcatLibs)
LOCAL_CFLAGS := -Werror
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_MODULE := logcatd
LOCAL_MODULE_TAGS := debug
LOCAL_SRC_FILES := logcatd_main.cpp event.logtags
LOCAL_SHARED_LIBRARIES := liblogcat $(logcatLibs)
LOCAL_CFLAGS := -Werror
include $(BUILD_EXECUTABLE)

猜你喜欢

转载自blog.csdn.net/whuzm08/article/details/80495582