注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

logcat源码分析(六)  

2011-10-15 10:53:17|  分类: 深入研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
继续看logcat.cppprocessBuffer函数,如果执行完Android_log_shouldPrintLine函数后,表明当前日志记录应当输出,则调用android_log_printLogLine函数来输出日志记录到文件fd中, 这个函数也是定义在system/core/liblog/logprint.c文件中:
int Android_log_printLogLine(  
    AndroidLogFormat *p_format,  
    int fd,  
    const AndroidLogEntry *entry)  
{  
    int ret;  
    char defaultBuffer[512];  
    char *outBuffer = NULL;  
    size_t totalLen;  
  
    outBuffer = Android_log_formatLogLine(p_format, defaultBuffer,  
            sizeof(defaultBuffer), entry, &totalLen);  
  
    if (!outBuffer)  
        return -1;  
  
    do {  
        ret = write(fd, outBuffer, totalLen);  
    } while (ret < 0 && errno == EINTR);  
  
    if (ret < 0) {  
        fprintf(stderr, "+++ LOG: write failed (errno=%d)\n", errno);  
        ret = 0;  
        goto done;  
    }  
  
    if (((size_t)ret) < totalLen) {  
        fprintf(stderr, "+++ LOG: write partial (%d of %d)\n", ret,  
                (int)totalLen);  
        goto done;  
    }  
  
done:  
    if (outBuffer != defaultBuffer) {  
        free(outBuffer);  
    }  
  
    return ret;  
}  
        这个函数的作用就是把AndroidLogEntry格式的日志记录按照指定的格式AndroidLogFormat进行输出了,这里,不再进一步分析这个函数。
 在processBuffer函数中,最后还有一个rotateLogs的操作:
 
static void rotateLogs()  
{  
    int err;  
  
    // Can't rotate logs if we're not outputting to a file   
    if (g_outputFileName == NULL) {  
        return;  
    }  
  
    close(g_outFD);  
  
    for (int i = g_maxRotatedLogs ; i > 0 ; i--) {  
        char *file0, *file1;  
  
        asprintf(&file1, "%s.%d", g_outputFileName, i);  
  
        if (i - 1 == 0) {  
            asprintf(&file0, "%s", g_outputFileName);  
        } else {  
            asprintf(&file0, "%s.%d", g_outputFileName, i - 1);  
        }  
  
        err = rename (file0, file1);  
  
        if (err < 0 && errno != ENOENT) {  
            perror("while rotating log files");  
        }  
  
        free(file1);  
        free(file0);  
    }  
  
    g_outFD = openLogFile (g_outputFileName);  
  
    if (g_outFD < 0) {  
        perror ("couldn't open output file");  
        exit(-1);  
    }  
  
    g_outByteCount = 0;  
  
}  
        这个函数只有在执行logcat命令时,指定了-f <filename>参数时,即g_outputFileName不为NULL时才起作用。它的作用是在将日志记录循环输出到一组文件中。例如,指定-f参数为logfile,g_maxRotatedLogs为3,则这组文件分别为:logfile,logfile.1,logfile.2,logfile.3
 
当当前输入到logfile文件的日志记录大小g_outByteCount大于等于g_logRotateSizeKBytes时,就要将logfile.2的内容移至logfile.3中,同时将logfile.1的内容移至logfile.2中,同时logfle的内容移至logfile.1中,再重新打开logfile文件进入后续输入。这样做的作用是不至于使得日志文件变得越来越来大,以至于占用过多的磁盘空间,而是只在磁盘上保存一定量的最新的日志记录。这样,旧的日志记录就会可能被新的日志记录所覆盖。默认的g_logRotateSizeKBytes16k,可以通过logcatr参数指定大小。

对logcat源码的分析到此结束了!
  评论这张
 
阅读(608)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017