工作问题经验整理(1)——在so库中日志写到主程序日志文件

 

一、(20190316)

1、问题描述:需要在so库中写日志,可以采用两种方法(网络开源日志库很多,比如zlog日志库):

  • (1)so库自己定义写日志函数,自己管理日志文件;
  • (2)在调用so库的主应用程序中写日志,同时需要将so库中的日志写入到主应用程序的日志文件里面,由主应用程序统一进行日志写等级控制和日志文件管理;

2、问题分析:so库自己定义写日志且自己管理日志文件,只需要定义好写日志的函数即可,此处重点描述第(2)种类型,将so库中的日志写入到主应用程序日志文件中。

3、解决方案:so库想把日志写入到主应用程序日志文件中,就需要调用和主应用程序写日志同样的接口进行日志写入,也即第1步就需要解决so库调用主应用程序函数接口的功能,此处采用回调方式实现

(1)首先在so库的头文件中, 定义so库写日志 回调函数指针,如下:

// so库头文件 lib_testLog.h
extern uchar (*__LIB_WRITE_LOG)(char *buf,  int buf_len);

(2)在so库实现文件中,不要实现函数(如果需要,当然也可以定义实现so库自己的默认写日志函数),如下:

// so库实现文件 lib_testLog.c
uchar (*__LIB_WRITE_LOG)(char *buf, int buf_len) = NULL;

(3)在主应用程序,将主应用程序写日志接口赋值给so库对外提供的回调函数指针,如下:

// 在主应用程序中,将写日志函数赋值给so库回调函数指针

int main(void)
{
    // 回调函数,提供了so库调用主应用程序接口,实现写日志到文件
    __LIB_WRITE_LOG = mainApp_writeLogFunc;
    return 0;
}

static uchar mainApp_writeLogFunc(char *buf,  int buf_len)
{
    // 此接口是对zlog日志库进一步封装得到的主程序写日志函数
	zlog_writeLogToFile(log_lv, "%d:%s", buf_len, buf);
	return 0;
}

(4)在so库中,就可以使用上面的回调指针进行写日志操作:

// so库实现文件 lib_testLog.c
// so库进一步封装写日志回调函数
uchar lib_writeLog(char *fmt, ...)
{
	va_list argptr;
	uchar szbuf[256];
	memset(szbuf, 0, sizeof(szbuf));
	va_start(argptr, fmt);
	vsnprintf(szbuf, sizeof(szbuf)-1, fmt, argptr);
	va_end(argptr);
		
	__LIB_WRITE_LOG(szbuf, strlen(szbuf));
	return 0;
}

uchar test_lib_writeLog()
{
    // 当然,此处__LINE__每次都打印当前行,稍作调整即可打印实际问题发生所在行,仅做示例
    lib_writeLog("Test lib write log to file : %d\n", __LINE__);
    return 0;
}

(5)总结:

  1. zlog写日志是通过配置文件进行日志等级和格式控制,同时支持日志转档,非常方便;
  2. 在so库中将日志写入到主应用程序日志文件中进行日志统一管理,这个需求以前就思考过,后来在项目中看见上面的一种实现方式,此处记下学习。同时提醒自己:了解自己的需求,然后,尽可能实现它。
  3. 上面提及so库可以自己提供写日志函数自己管理日志文件,进一步扩展可以通过配置文件配置选项进行控制:如果配置了统一日志文件则赋值so库回调函数指针,如果没有则使用so库默认日志函数;

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值