工作问题经验整理——在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)总结:
- zlog写日志是通过配置文件进行日志等级和格式控制,同时支持日志转档,非常方便;
- 在so库中将日志写入到主应用程序日志文件中进行日志统一管理,这个需求以前就思考过,后来在项目中看见上面的一种实现方式,此处记下学习。同时提醒自己:了解自己的需求,然后,尽可能实现它。
- 上面提及so库可以自己提供写日志函数自己管理日志文件,进一步扩展可以通过配置文件配置选项进行控制:如果配置了统一日志文件则赋值so库回调函数指针,如果没有则使用so库默认日志函数;
以上是关于工作问题经验整理——在so库中日志写到主程序日志文件的主要内容,如果未能解决你的问题,请参考以下文章
工作问题经验整理——带版本号so库文件含义和主程序链接so库机制
日志记录类(明确FileStreamDictionary等用法)
增强共享库中的日志记录通道过滤在 linux 上无法按预期工作