Android源码——Logger日志系统

https://www.cnblogs.com/ithaibo-sit/p/5707916.html

Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的。

日志保存在内核空间中

缓冲区保存日志

分类方法:日志的类型  +   日志的输出量

日志类型:   main          sysytem       radio        events

以上四种日志分别通过以下四个设备文件来访问:

/dev/log/main

/dev/log/system

.../radio

.../events

Android系统在应用中提供了三个 Java接口,往Logger日志驱动程序中写入日志,分别对应main,  system,  event:

android.util.Log

android.util.Slog

android.util.EventLog

Logger日志驱动程序

基础数据结构

Logger主要用到了logger_entry     logger_log     logger_reader三个结构体。

struct logger_entry {

__u16 len; /* length of the payload */

__u16 hdr_size; /* sizeof(struct logger_entry_v2) */

__s32 pid; /* generating process's pid */

__s32 tid; /* generating process's tid */

__s32 sec; /* seconds since Epoch */

__s32 nsec; /* nanoseconds */

uid_t euid; /* effective UID of logger */

char msg[0]; /* the entry's payload */

};

------------------------------------------------------------------

struct logger_log {

unsigned char *buffer;  /* the ring buffer itself 保存内容*/

struct miscdevice misc; /* misc device representing the log 日志设备*/

wait_queue_head_t wq; /* wait queue for readers */

struct list_head readers; /* this log's readers */

struct mutex mutex; /* mutex protecting buffer */

size_t w_off; /* current write head offset */

size_t head; /* new readers start here */

size_t size;   /* size of the log */

}

-------------------------------------------------------------------------------------------------------

struct logger_reader {

struct logger_log *log; /* associated log */

struct list_head list; /* entry in logger_log's list */

size_t r_off; /* current read head offset */

bool r_all; /* reader can read all entries */

int r_ver; /* reader ABI version */

};


日志设备的初始化过程

     日志设备的初始化:

          入口函数:logger_init

日志设备的打开,读取, 写入, 分别对应:logger_open, logger_read, logger_aio_write.

初始化过程

     注册日志设备     kernel/goldfish/drivers/staging/android/logger.c   init_log

     将日志设备注册到系统中:  init_log中调用misc_register函数

     在misc_register中调用device_create函数注册到系统中

     在设备的/dev目录下看到/dev/log/main,  .../events,  .../radio


日志设备文件的打开过程

日志驱动程序的读写之前,都需要先打开日志设备文件。日志设备文件的打开函数为looger_open:

kernel/goldfish/drivers/statging/android/logger.c  logger_open()

get_log_from_minor根据从设备号获取日志缓冲区


日志记录的读取过程

     进程调用read函数,从日志设备中读取日志记录

     logger_read被调用:


do_read_log_to_user: 

    /*

     * First, copy the header to userspace, using the version of

     * the header requested

     */

   /*

     * We read from the msg in two disjoint operations. First, we read from

     * the current msg head offset up to 'count' bytes or to the end of

     * the log, whichever comes first.

     */

   /*

     * Second, we read any remaining bytes, starting back at the head of

     * the log.

     */


运行时库层日志

write_to_log

      函数指针write_to_log第一次被调用的时候,便执行函数__write_to_log_init来初始化日志库liblog。

  • 日志初始化过程(__write_to_log_init函数)
  1.      如果  write_to_log 指向__write_to_log_init

          执行打开日志设备文件/log/main,.../radio, .../events, .../system到相应的log-fds数组中。

          write_to_log指向__write_to_log_kernel

  1.       如果main, radio, events日志设备文件其中一个没有打开成功

          关闭日志文件/log/main,.../radio, .../event,并将write_to_log指向__write_to_log_null

  1.     如果system日志设备文件没有打开

          将system和main的日志记录全都写入到日志设备文件/dev/log/main中

  • __write_to_log_kernel函数

          根据参数log_id在全局数组log_fds中找到对应的日志设备文件描述符,

          把日志记录写入到Logger日志驱动程序中

__write_to_log_null

     该函数什么也不做

__android_log_write

      默认情况下,日志记录类型为main。如果参数日志标签以“RIL”开头或HTC_RIL、AT、GSM、STK、CDMA、PHONE、SMS,日志类型则为radio。

__android_log_buf_write

     该函数的实现和__android_log_write类似,不过可以指定写入日志记录的类型。

__android_log_vprint     __android_log_print     __android_log_assert

这三个函数都是调用__android_log_write日志驱动程序写入日志记录的。

__android_log_bWrite     __android_log_btwrite

这两个函数写入的日志记录的类型为events。其中,函数__android_log_bwrite写入的日志记录的内容尅有由多个值组成,而后者只能写入一个值。


C/C++日志写入接口

logv logd logi logw loge用来写入类型为main的日志记录

slogv slogd slogi slogw sloge用来写入类型为system的日志记录

log_event_int     log_event_long     long_event_string用来写入类型为events的日志记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值