Skip to main content

windows 日志

Bugly-Windows 日志模块bugly_logger.dll由两部分组成:

  1. diagnose: 提供日志捞取、日志染色、条件采集等端上日志服务。
  2. Logger: 提供本地打日志能力,底层基于微信xlog方案。次模块可选接入,业务前期可使用自有打日志模块,然后将日志路径传给diagnose模块配合使用。

支持能力:

  1. 日志捞取(支持在线日志配置push、日志批量捞取)
  2. 日志染色(支持批量染色)
  3. 主动上报(支持日志上报、大文件上报)

一、快速开始

日志的web端配置和捞取操作参考这里,所有平台的日志捞取操作都是一样的。

注意:web端的 设备ID 就是客户端的 userId

日志能力的支持从 bugly-windows 1.0.7 版本开始,之前的版本不支持日志能力。

先从制品库中下载发布tag放入项目工程中

include目录加入头文件搜索目录,将lib目录下对应的目录加入库搜索目录,将bugly_logger.lib加入链接

diagnose 接入

#include "logger/bugly_diagnose.h"
#include "logger/diagnose/log_sdk_config.h"

/// bugly产品的appID
#define BUGLY_APPID L"18xxxxxxxe"

/// bugly产品的appKey
#define BUGLY_APPKEY L"ab7b0c76-xxxx-xxxx-xxxx-c8e378ca6fd3"

/// bugly产品的bundleId
#define BUGLY_BUNDLE_ID L"com.xxxxxxxx.win"

/// 初始化Diagnose
void initDiagnose() {
/// Diagnose保存配置文件的目录,该目录必须可写
std::wstring buglyRootDir = GenLogPathW();

/// 用于解密日志的key,可以去Bugly网页生成和查看
std::wstring pubKey = L"";

/// Diagnose捞取日志时的搜索目录,可以传多个
std::wstring buglyLogPath = buglyRootDir + L"\\logs";
wchar_t* logDirs[1];
logDirs[0] = const_cast<wchar_t*>(buglyLogPath.c_str());

/// 初始化Diagnose
Bugly::Diagnose::BuglyDiagnose::initDiagnose(BUGLY_APPID, BUGLY_APPKEY, BUGLY_BUNDLE_ID, L"3.16.0.2", L"1.0.7", (const wchar_t**)logDirs, 1, buglyRootDir.c_str(), pubKey.c_str());

/// 业务用户登录成功后,设置userId。用户切换账号后也要设置。这里的userId就是bugly上捞取日志页面的 设备ID
Bugly::Diagnose::BuglyDiagnose::setUserId("hodxiang");
}

/// 主动上报日志:
std::vector<std::string> logFilesList;
std::string buglyRootDir = GenLogPathA();

/// 支持指定文件
logFilesList.push_back(buglyRootDir + "\\logs\\some_log_file.log");

/// 也支持指定文件夹,diagnose会自动将文件夹下所有的文件打包上传
logFilesList.push_back(buglyRootDir + "\\some_other_dir");

char** logFiles = (char**)malloc(logFilesList.size() * sizeof(char*));
int idx = 0;
for (const auto& f : logFilesList) {
logFiles[idx++] = const_cast<char*>(f.c_str());
}

/// 开始上传
Bugly::Diagnose::BuglyDiagnose::uploadLogFiles(const_cast<const char**>(logFiles), idx, "bugly_integrated_demo", "some test log for upload in bugly_integrated_demo", nullptr, nullptr);
提醒

diagnose模块对主动上报有一些限制:

  1. 压缩打包前会检查待上传文件总大小,如果超过500MB就会放弃上传。
  2. 5分钟内最多只能上传2次。
  3. 每天上传的限额是500MB(压缩打包后的大小)。

buglyLogger接入

如果需要使用自带的buglyLogger答应日志,按一下步骤接入

#include "logger/bugly_logger_proxy.h"
#include "logger/bugly_logger/bugly_logger.h"

/// 初始化日志输出模块
void initBuglyLogger()
{
/// 日志配置文件存放目录,该目录必须可写
std::string buglyLogRootDir = GenLogPathA();
/// 日志文件存放目录,该目录最好不要存放其他文件,防止清理log时被删除
std::string buglyLogPath = buglyLogRootDir + "\\logs";

/// 日志加密用的pubkey,如果需要加密日志,则去bugly页面生成加密key,并填到这里
std::string pubKey = "";

Bugly::BuglyLoggerConfig logConfig(buglyLogPath.c_str(), buglyLogRootDir.c_str(), "bugly_integrated_demo", Bugly::EBuglyLogLevel::kLevelInfo, pubKey.c_str());
#ifndef NDEBUG
/// release 构建默认日志等级为kLevelDebug等级
logConfig.defaultLogLevel_ = Bugly::EBuglyLogLevel::kLevelDebug;
logConfig.enableConsoleLog_ = true;
#else
logConfig.enableConsoleLog_ = false;
#endif

/// 方式1,使用defaultProxy托管日志实例,适用于只需要单日志实例的场景
Bugly::BuglyLoggerProxy::defaultProxy().setBuglyLogger(logConfig);
/// 程序结束或者异常时需要将日志写入文件
Bugly::BuglyLoggerProxy::defaultProxy().flushLog();



/// 方式2,直接创建logger实例,然后调用对应接口写入日志
auto handler = ::LoadLibraryExA("bugly_logger.dll", nullptr, LOAD_LIBRARY_SEARCH_USER_DIRS | LOAD_LIBRARY_SEARCH_SYSTEM32);
if (handler == nullptr) {
handler = ::LoadLibraryA("bugly_logger.dll");
}
typedef Bugly::BuglyLogger* (__stdcall* CreateBuglyLoggerT)(const Bugly::BuglyLoggerConfig*);
CreateBuglyLoggerT creater = reinterpret_cast<CreateBuglyLoggerT>(::GetProcAddress(handler, "CreateBuglyLoggerImpl"));
Bugly::IBuglyLoggingIMP* logger = creater(&logConfig);

logger->log(Bugly::EBuglyLogLevel::kLevelInfo, "th4", __FILE__, __FUNCTION__, __LINE__, "on log out:%s", "hello");

/// 程序结束或者异常时需要将日志写入文件
logger->flushLog(true);
}

bugly 自身log输出

IBuglyAgent新增加了一个接口用于开启crashpad_handler.exe守护进程的日志输出,用于排查bugly本身的问题:


/**
* @description: 加载bugly日志模块,用于bugly自身的log输出
* @param log_dir: 存放log文件夹的路径,这里需要业务传入是因为如果是服务进程拉起的,可能获取不到temp目录。最终的log文件会放在log_dir/logs目录下。因为log_dir下还会存一些配置文件。
* @param dllpath: bugly_logger.dll的路径,如果传nullptr,则默认在exe同目录下
*/
virtual bool LoadBuglyLoggerModule(const wchar_t* log_dir, const wchar_t* dllpath = nullptr) = 0;

捞取和上报日志的时候,可以将bugly自身的log也附带上来。