2.2.3 Android日志与logd交互过程
2.2.3.1 Android日志传递给logd
Android app层或framework层,通过调用Log/Slog/Rlog中d方法打印日志,通过JNI会调用到native层android_util_Log_println_native接口,具体见下图内容。
接下来具体调用流程如下:
/XXX/system/logging/liblog/logger_write.cpp
__android_log_buf_write
-->__android_log_write_log_message
-- >get_logger_function()
-- >__android_log_logd_logger
-- >write_to_log
-- >LogdWrite
最终写到 “/dev/socket/logdw”中,此时logd中的LogListener会监测到存在log信息需要写入,待log保存到buffer中后,再通知LogReader将新保存的log传递给logcat等
socket信息如下
// Note that it is safe to call connect() multiple times on DGRAM Unix domain sockets, so this
// function is used to reconnect to logd without requiring a new socket.
static void LogdConnect(int sock) {
sockaddr_un un = {};
un.sun_family = AF_UNIX;
strcpy(un.sun_path, "/dev/socket/logdw");
TEMP_FAILURE_RETRY(connect(sock, reinterpret_cast(&un), sizeof(sockaddr_un)));
}
2.2.3.2 logd中的log保存过程
具体代码路径如/XXX/system/logging/logd/main.cpp,从文件的main函数中可以看到,logd执行过程中创建了LogBuffer,LogReader,LogListener和CommandListener四个对象,上文有详细介绍,本节暂且不予解释,详情见2.3.1.2节内容。
接下来创建LogListener的对象,开启一个线程“logd.writer”监听数据,具体过程见下图。
HandleData()
-->logbuf_->Log
新建一个LogBufferElement对象,实现log的保存.
2.2.3.3 logcat获取logd日志
/XXX/system/logging/logcat/logcat.cpp
int main(int argc, char** argv) {
Logcat logcat;
return logcat.Run(argc, argv);
}
具体的logcat命令参数解析在Run函数中执行。
android_logger_list_read接下来的调用过程如下:
android_logger_list_read
-->LogdRead //打开logdr,并通过socket获取log
-->logdOpen
logd的main函数中有开启LogReader监听
// LogReader listens on /dev/socket/logdr. When a client
// connects, log entries in the LogBuffer are written to the client.
LogReader* reader = new LogReader(log_buffer, &reader_list);
if (reader->startListener()) {
return EXIT_FAILURE;
}
LogReader继承自SocketListener,如果socket监听到数据,则执行onDataAvailable函数进行处理。
最后加入read_list_中:
最终通过ProcessBuffer输出日志内容,打印log_msg日志到界面或者fd文件中。具体内容包括:处理日志buffer内容、回滚打印日志内容等。
-
Android
+关注
关注
12文章
3946浏览量
128064 -
代码
+关注
关注
30文章
4841浏览量
69194 -
日志
+关注
关注
0文章
139浏览量
10690
发布评论请先 登录
相关推荐
对于大规模系统日志的日志模式提炼算法的优化
![对于大规模系统<b class='flag-5'>日志</b>的<b class='flag-5'>日志</b>模式提炼算法的优化](https://file.elecfans.com/web2/M00/49/61/poYBAGKhwKqAHdGmAAAZlCzbn3c079.jpg)
Android系统的日志模式选择机制
![<b class='flag-5'>Android</b>系统的<b class='flag-5'>日志</b>模式选择机制](https://file.elecfans.com/web2/M00/49/88/poYBAGKhwMOARqTNAAAcJuvP-3M148.jpg)
工业智能网关日志有哪些?如何输出和导出网关日志查看呢?
![工业智能网关<b class='flag-5'>日志</b>有哪些?如何输出和导出网关<b class='flag-5'>日志</b>查看呢?](https://file.elecfans.com/web2/M00/74/28/pYYBAGNY8_6AcJwOAABe-QzVfbM846.png)
Android开发中的日志接口介绍
![<b class='flag-5'>Android</b>开发中的<b class='flag-5'>日志</b>接口介绍](https://file1.elecfans.com/web2/M00/B2/62/wKgZomVfC8KAahopAAARa9jqvRM890.jpg)
logd守护进程整体设计架构
![<b class='flag-5'>logd</b>守护进程整体设计架构](https://file1.elecfans.com/web2/M00/B2/63/wKgZomVfDUiAL-UdAACMsRGWHwM582.jpg)
kernel日志写入logd介绍
![kernel<b class='flag-5'>日志</b>写入<b class='flag-5'>logd</b>介绍](https://file1.elecfans.com/web2/M00/B2/66/wKgZomVfFj6AZDb8AABCDvoIhaY109.jpg)
logcat命令抓取日志方法
![logcat命令抓取<b class='flag-5'>日志</b>方法](https://file1.elecfans.com/web2/M00/B2/66/wKgZomVfGPeABVS6AABEIBEupeg325.jpg)
Android开发中如何解决典型场景缺通用日志的问题
![<b class='flag-5'>Android</b>开发中如何解决典型场景缺通用<b class='flag-5'>日志</b>的问题](https://file1.elecfans.com/web2/M00/B2/67/wKgZomVfHA2ATQgJAAHfZyjxAJY029.jpg)
奇怪!应用的日志呢??
![奇怪!应用的<b class='flag-5'>日志</b>呢??](https://file1.elecfans.com//web2/M00/ED/87/wKgaomZnuv2ABNQvAAXZtvdNTDo518.png)
日志篇:模组日志总体介绍
![<b class='flag-5'>日志</b>篇:模组<b class='flag-5'>日志</b>总体介绍](https://file1.elecfans.com/web2/M00/0A/11/wKgZomcZg22AOW6TAAABQt1t03I437.png)
评论