`
java-mans
  • 浏览: 11457067 次
文章分类
社区版块
存档分类
最新评论

解读Android LOG机制的实现:(6)c/c++域使用LOG

 
阅读更多

解读Android LOG机制的实现:(6)c/c++域使用LOG

田海立@CSDN

2011/07/24

Android提供了的LOG机制的实现贯穿了Java,JNI,本地c/c++实现以及LINUX内核驱动等Android的各个层次,并且简单明晰,是一个相当不错的解读案例。本系列文章针对LOG机制的内部实现机理进行解读,本文是系列之六,解读Android的c/c++程序中如何使用LOG机制记录LOG信息。

c/c++本地库中实现LOG输出

通过前面的文章知道Android的Java中通过android.util.Log输出Log信息,那Android的本地c/c++程序能不能也通过这样的机制来记录Log呢?再回头看Log现有的c/c++的本地实现,答案当然是肯定的,而且是相当简单。Android直接在头文件(system/core/include/cutils/log.h)里定义了一些宏就可以很好的实现了。

因为,LOG分了VERBOSE/DEBUG/INFO/WARN/ERROR/ASSERT等类别,简单起见,以DEBUG为例的实现来说明。

#ifndef LOGD
#define LOGD(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#endif
 
#ifndef LOGD_IF
#define LOGD_IF(cond, ...) \
    ( (CONDITION(cond)) \
    ? LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) \
    : (void)0 )
#endif
 
#ifndef LOG
#define LOG(priority, tag, ...) \
    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
#endif
 
#ifndef LOG_PRI
#define LOG_PRI(priority, tag, ...)                                     \
    ({                                                                  \
       if (((priority == ANDROID_LOG_VERBOSE) && (LOG_NDEBUG == 0)) ||  \
           ((priority == ANDROID_LOG_DEBUG) && (LOG_NDDEBUG == 0))  ||  \
           ((priority == ANDROID_LOG_INFO) && (LOG_NIDEBUG == 0))   ||  \
            (priority == ANDROID_LOG_WARN)                          ||  \
            (priority == ANDROID_LOG_ERROR)                         ||  \
            (priority == ANDROID_LOG_FATAL))                            \
                (void)android_printLog(priority, tag, __VA_ARGS__);     \
    })
#endif
 
#define android_printLog(prio, tag, fmt...) \
__android_log_print(prio, tag, fmt)

而这一系列宏,最后还是用到了函数__android_log_print()

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);
}


这里还是调到了函数__android_log_write()。这个函数应该很熟悉吧,正是前文叙及的c/c++本地函数实现写设备文件的地方。

c/c++程序中记录Log的做法

要在c/c++中记录Log通常的做法是:

定义自己的TAG_LOG宏;包含头文件log.h;然后在需要记录Log的地方直接用LOGV/LOGD/LOGI/LOGW/LOGE即可。

比如,文件lights.c中就在开头这样写,

#define LOG_TAG "lights"
#include <cutils/log.h>

然后在该文件的后续部分,大量的用了LOGV/LOGE, etc来记录LOG。

【本系列文章】

解读Android LOG机制的实现:(1)LOG的实现架构

解读LOG机制的实现架构。

解读Android LOG机制的实现:(2)Java域输出LOG

解读Android的Java程序中如何输出LOG信息到LOG的体系中。

解读Android LOG机制的实现:(3)JNI及NATIVE域写设备文件

解读android.util.Log的JNI实现,以及在c/c++的本地实现中如何操作设备文件写Log信息。

解读Android LOG机制的实现:(4)LOG设备驱动logger

解读LINUX内核中的设备驱动Logger中实现。Logger是Android为Linux写的一个MISC类型驱动,用循环队列实现了读者/写者。Logger是整个LOG机制实现的核心。

解读Android LOG机制的实现:(5)获取LOG程序LogCat

解读应用程序LogCat如何通过对设备文件的open()/select()/read()来获取LOG信息。

解读Android LOG机制的实现:(6)c/c++域使用LOG

解读Android的c/c++程序中如何使用LOG机制记录LOG信息。

分享到:
评论

相关推荐

    java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport

    java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport异常处理

    linux系统日志解析

    linux系统日志解析,系统日志一般都存在/var/log下 常用的系统日志如下: 核心启动日志:/var/log/dmesg 系统报错日志:/var/log/messages 邮件系统日志:/var/log/maillog FTP系统日志:/var/log/xferlog 安全信息和系统...

    NDK开发C/C++配置Log打印日志

    NDK开发C/C++配置Log打印日志,可以参考:https://blog.csdn.net/niuba123456/article/details/80991477

    Android代码-LogCollector:一个收集 app 输出日志的工具

    一个收集 app 输出日志的工具,输出文件:模拟器是 /sdcard/Android/data/项目包名/cache/,真机是 /Android/data/项目包名/cache/,里面的 crash 目录是崩溃日志,log 目录是 logcat 日志。 如何使用 在 module ...

    kafka 解决log4j:ERROR Failed to rename错误解决办法错误的jar包

    log4j:ERROR Failed to rename

    log4cplus 源码(C++编写的开源的日志系统)

    log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置。 ### 简介 ### log4cplus是C++编写的开源的日志系统,前身是java...

    DebugLog Log调试工具

    Android DebugLog调试工具,此资源对应的博客地址为:http://blog.csdn.net/bbld_/article/details/39757099

    C/C++ LOG记录模块

    项目开发中经常需要记录log,上传一个各种场景都可以使用的记录log的DLL 将格式化字符串输出到log文件中,代码会在执行文件的目录,自动创建子目录 log\ 并在其中创建跟执行文件同名的log文件 当记录的log文件超过5...

    graylog2使用说明(docker)

    - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 # 这里需要修改为要暴露的机器的地址 - GRAYLOG_HTTP_EXTERNAL_URI=http://10.121.60.2:9000/ links: - ...

    log4j:ERROR Failed to rename错误解决办法

    在Tomcat6下使用Log4j记录日志,天创建新日志文件时(日志文件设置为:org.apache.log4j.DailyRollingFileAppender)报: log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以...

    0_BUG:C_C++商用工程之道(高清).part3

    具体内容包括商用工程开发思路、C/C++无错化程序设计、设计自己的工程库、Log日志管理系统等。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。《0 bug:C/C++商用工程之道》主要针对C/...

    0_BUG:C_C++商用工程之道(高清).part1

    具体内容包括商用工程开发思路、C/C++无错化程序设计、设计自己的工程库、Log日志管理系统等。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。《0 bug:C/C++商用工程之道》主要针对C/...

    0_BUG:C_C++商用工程之道(高清).part2

    具体内容包括商用工程开发思路、C/C++无错化程序设计、设计自己的工程库、Log日志管理系统等。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。《0 bug:C/C++商用工程之道》主要针对C/...

    log4net .net日志打印源代码 支持win32或wm

    日志输出操作,支持WinCe及Win32平台:功能强大,代码简洁 // 摘要: // 日志输出操作,支持WinCe及Win32平台。... private void WriteLog(LOG_LEVEL logLevel, string log) { } #endregion } }

    Android代码-Graylog-Android

    Graylog client for Android devices Graylog is a rsyslog web interface based on Ruby On Rails: http://github.com/lennartkoopmann/Graylog Watch your favorite errors now mobile on your android device! :)...

    log4 DELPHI 日志

    日志组件log4delphi与log4j、log4cpp如出一辙 1.安装:log4Delphi无需安装,直接解压包解压后放入任意目录(我的目录是:'D:/3rdlib/delphi/log4delphi-0.7)即可。 2.使用:在工程文件中引用解压包中src目录下...

    Log4Cpp使用实例

    封装了一个使用类,从本地读取配置log级别等信息,可输出多个种类的日志文件,输出示例如下 [2017-02-20 16:09:51.910](NOTICE)Sys : 进入了CPfy_log4cppDlg::OnBnClickedButton1函数 [2017-02-20 16:09:51.911]...

    android中Log的实现机制

    对想深入研究Android中Log的实现机制的同志有用,在此分享给大家

    判断链表是否为回文链表leetcode-C_CPP_PROJECTS:学习C/C++

    C/C++编程以及Git操作练习(使用VSCode) 效果预览 1. VSCode配置C/C++编译 .vscode\c_cpp_properties.json配置includePath .vscode\tasks.json配置gcc/g++编译指令 .vscode\launch.json配置Debug具体指令(Debug效果) ...

    Android代码-android-async-http

    Changelog See what is new in version 1.4.9 released on 19th September 2015 https://github.com/loopj/android-async-http/blob/1.4.9/CHANGELOG.md Javadoc Latest Javadoc for 1.4.9 release are available ...

Global site tag (gtag.js) - Google Analytics