看到标题,有人会问了。输出log在控制台也可以啊也能看到啊等等这一系列问题,这里我想说的是,那样确实方便查看调试,但想过应用上架后为了统计一些cash日志你怎么办?所以,我们以log文件的方式生成在sd卡,下面代码主要是C++中的,至于生成好了的log文件在java中怎么上传服务器这应该很简单,这步骤就跳过。
首先在头文件中声明:
void Log(LPCTSTR pszFormat, ...);
void LogV(LPCTSTR pszFormat, va_list args);
然后再实现文件cpp中写方法实现:
// 日志函数
void Log(LPCTSTR pszFormat, ...) {
va_list args;
va_start(args, pszFormat);
LogV(pszFormat, args);
va_end(args);
}
// 日志函数
void LogV(LPCTSTR pszFormat, va_list args) {
// 日志关闭则不做处理
// if (!m_bLogEnabled) return;
// 格式化日志
char szContent[32*1024] = { 0 };
vsnprintf(szContent, ASIZE(szContent), pszFormat, args);
// 输出内容
char szFile[MAX_PATH * 2] = { "存放的路径"};
strcat(szFile,"log名称.log");
FILE* fpFile = fopen(szFile, "ab");
if (fpFile != NULL) {
string strContent =szContent;
fwrite(strContent.c_str(), strContent.length(), 1, fpFile);
fclose(fpFile);
}
}
最后调用:
Log("%s \r\n","我是C底层输出的log日志");
然后打开手机sd卡找到你创建的log名称就可以了。这是博主测试的看下图:
升级改造版本代码如下:
static bool g_bLogEnabled=false;
// 日志函数
void Log(LPCSTR pszFormat, ...) {
va_list args;
va_start(args, pszFormat);
LogV(pszFormat, args);
va_end(args);
}
// 日志函数
void LogV(LPCSTR pszFormat, va_list args) {
// 日志关闭则不做处理
if (!g_bLogEnabled) return;
// 格式化日志
string strLogDir=FileUtils::sharedFileUtils()->getWritablePath();
char szContent[32*1024] = { 0 };
vsnprintf(szContent, sizeof(szContent)/sizeof(szContent[0]), pszFormat, args);
// 输出内容
char szFile[260 * 2] = { 0 };
strcat(szFile,strLogDir.c_str());
strcat(szFile,"henry.log");
FILE* fpFile = fopen(szFile, "ab");
if (fpFile != NULL) {
fwrite(szContent, strlen(szContent), 1, fpFile);
fclose(fpFile);
}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
__android_log_print(ANDROID_LOG_DEBUG,"main",szContent);
#else
printf("%s",szContent);
#endif
// __android_log_print(ANDROID_LOG_DEBUG,"main",strLogDir.c_str());
}
#if defined(NDK_BUILD)
#define LOG Log
#else
#define LOG
#endif
这个有个问题就是这句获取地址的代码string strLogDir=FileUtils::sharedFileUtils()->getWritablePath();最后在手机中找不到.log的文件。Android里的读写权限都加了也搜索不到。但网上说要root权限。这个我就没测试。毕竟公司的手机。呵呵。大家如果知道原因可以回复艾特我。