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

Posted yxtxiaotian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作问题经验整理——在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库默认日志函数;

 

 

 

 

 

 

 

 

以上是关于工作问题经验整理——在so库中日志写到主程序日志文件的主要内容,如果未能解决你的问题,请参考以下文章

工作问题经验整理——带版本号so库文件含义和主程序链接so库机制

日志记录类(明确FileStreamDictionary等用法)

增强共享库中的日志记录通道过滤在 linux 上无法按预期工作

工作经验(Unity篇)

Android so库中UnsatisfiedLinkError

Android so库中UnsatisfiedLinkError