#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)