解读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异常处理
linux系统日志解析,系统日志一般都存在/var/log下 常用的系统日志如下: 核心启动日志:/var/log/dmesg 系统报错日志:/var/log/messages 邮件系统日志:/var/log/maillog FTP系统日志:/var/log/xferlog 安全信息和系统...
NDK开发C/C++配置Log打印日志,可以参考:https://blog.csdn.net/niuba123456/article/details/80991477
一个收集 app 输出日志的工具,输出文件:模拟器是 /sdcard/Android/data/项目包名/cache/,真机是 /Android/data/项目包名/cache/,里面的 crash 目录是崩溃日志,log 目录是 logcat 日志。 如何使用 在 module ...
log4j:ERROR Failed to rename
log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置。 ### 简介 ### log4cplus是C++编写的开源的日志系统,前身是java...
Android DebugLog调试工具,此资源对应的博客地址为:http://blog.csdn.net/bbld_/article/details/39757099
项目开发中经常需要记录log,上传一个各种场景都可以使用的记录log的DLL 将格式化字符串输出到log文件中,代码会在执行文件的目录,自动创建子目录 log\ 并在其中创建跟执行文件同名的log文件 当记录的log文件超过5...
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 # 这里需要修改为要暴露的机器的地址 - GRAYLOG_HTTP_EXTERNAL_URI=http://10.121.60.2:9000/ links: - ...
在Tomcat6下使用Log4j记录日志,天创建新日志文件时(日志文件设置为:org.apache.log4j.DailyRollingFileAppender)报: log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以...
具体内容包括商用工程开发思路、C/C++无错化程序设计、设计自己的工程库、Log日志管理系统等。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。《0 bug:C/C++商用工程之道》主要针对C/...
具体内容包括商用工程开发思路、C/C++无错化程序设计、设计自己的工程库、Log日志管理系统等。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。《0 bug:C/C++商用工程之道》主要针对C/...
具体内容包括商用工程开发思路、C/C++无错化程序设计、设计自己的工程库、Log日志管理系统等。该书可供各大专院校作为教材使用,也可供从事相关工作的人员作为参考用书使用。《0 bug:C/C++商用工程之道》主要针对C/...
日志输出操作,支持WinCe及Win32平台:功能强大,代码简洁 // 摘要: // 日志输出操作,支持WinCe及Win32平台。... private void WriteLog(LOG_LEVEL logLevel, string log) { } #endregion } }
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! :)...
日志组件log4delphi与log4j、log4cpp如出一辙 1.安装:log4Delphi无需安装,直接解压包解压后放入任意目录(我的目录是:'D:/3rdlib/delphi/log4delphi-0.7)即可。 2.使用:在工程文件中引用解压包中src目录下...
封装了一个使用类,从本地读取配置log级别等信息,可输出多个种类的日志文件,输出示例如下 [2017-02-20 16:09:51.910](NOTICE)Sys : 进入了CPfy_log4cppDlg::OnBnClickedButton1函数 [2017-02-20 16:09:51.911]...
对想深入研究Android中Log的实现机制的同志有用,在此分享给大家
C/C++编程以及Git操作练习(使用VSCode) 效果预览 1. VSCode配置C/C++编译 .vscode\c_cpp_properties.json配置includePath .vscode\tasks.json配置gcc/g++编译指令 .vscode\launch.json配置Debug具体指令(Debug效果) ...
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 ...