我是靠谱客的博主 舒适书本,这篇文章主要介绍01. PJSIP LOG篇PJSIP LOG篇,现在分享给大家,希望可以做个参考。

PJSIP LOG篇

  • PJSIP LOG篇
    • log.h
    • log.c
    • 总结

PJSIP LOG篇

PJSIP内置log的模块,该模块可以自行定制,设计的十分灵活。

本次分析设计到的文件如下:

├── log.c
├── log_writer_printk.c
└── log_writer_stdout.c

log.h

使用枚举定义日志输出的内容里面包含的东西。

复制代码
1
2
enum pj_log_decoration{...}

##:是字符串连接,如果调用为PJ_LOG(1,"hello world"),则实际调用为pj_log_wrapper_1("hello world")

复制代码
1
2
PJ_LOG(level,arg) pj_log_wrapper_##level(arg)

该函数是 自定义重写函数的核心,只需要重新实现该函数,然后调用pj_log_set_log_func,将重新实现的函数传入进去,便可以进行函数重写。

复制代码
1
2
typedef void pj_log_func(int level, const char *data, int len);

该函数可以用来控制PJSIP打印日志的等级,即:6=very detailed..1=error only, 0=disabled,可以在初始化该库之前进行调用。

复制代码
1
2
PJ_DECL(void) pj_log_set_level(int level);

该函数用来控制输出

复制代码
1
2
PJ_DECL(void) pj_log_set_decor(unsigned decor);

该宏很有意思,他用编译参数宏PJ_LOG_MAX_LEVEL来控制相关函数是否实现,如果PJ_LOG_MAX_LEVEL=0也就相当于所有的日志都不用打印了,也就没有必要实现这些函数了,用define将这些函数定义为空,减少了编译库的大小。

复制代码
1
2
3
4
5
6
7
8
9
10
#if PJ_LOG_MAX_LEVEL >= 1 PJ_DECL(void) pj_log(const char *sender, int level, const char *format, va_list marker); pj_log_get_log_func(void); #else define pj_log_set_log_func(func) define pj_log_set_level(level) define pj_log_set_decor(decor) #endif

和上述的宏类似,如果PJ_LOG_MAX_LEVEL为0,则将pj_log_wrapper_1写为空实现。

复制代码
1
2
3
4
5
6
7
8
#if PJ_LOG_MAX_LEVEL >= 1 #define pj_log_wrapper_1(arg) pj_log_1 arg /** Internal function. */ PJ_DECL(void) pj_log_1(const char *src, const char *format, ...); #else #define pj_log_wrapper_1(arg) #endif

log.c

该全局变量为外部掉用pj_log_set_level设置下来的等级,用来在程序运行时候控制PJSIP打印日志的等级。

复制代码
1
2
static int log_max_level = PJ_LOG_MAX_LEVEL;

该函数是用来打印日志输出的函数。

复制代码
1
2
static pj_log_func *log_writer = &pj_log_write;

该函数是所有等级的函数最终都会调入该函数的。

复制代码
1
2
3
4
5
6
7
8
9
10
PJ_DEF(void) pj_log( const char *sender, int level, const char *format, va_list marker) { //... if (log_writer) (*log_writer)(level, log_buffer, len); //... }

log_writer则是最终输出的函数,在原本的项目中有log_writer_printk.c log_writer_stdout.c分别定义了该函数,而PJSIP则根据不同平台使用不同的实现,进行打印。

总结

  1. 该模块的宏定义是值得学习的,利用宏定义巧妙地在预处理阶段,将不需要的代码给删除掉,节省了代码段空间。
  2. 作为一个三方库,考虑的是十分周到了,利用pj_log_set_log_func来巧妙的让使用者自己控制日志怎么输出,考虑的十分周全。

一点拙见,欢迎交流。

最后

以上就是舒适书本最近收集整理的关于01. PJSIP LOG篇PJSIP LOG篇的全部内容,更多相关01.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部