阅读Sofia-SIP源码 - su模块 - su_default_log.c/su_global_log.c
来源:互联网 发布:js点击事件 编辑:程序博客网 时间:2024/05/24 05:02
之前一直提到:未看到过任何详细初始化su_log_t结构体变量的代码。可以说,su_default_log.h代码向我们展示了如何详细初始化su_log文件中申明的su_log_default变量。
su_log_t su_log_default[1] = {{ sizeof(su_log_t), "sofia",/* Log name */ "SOFIA_DEBUG",/* Environment variable controlling logging level */ SOFIA_DEBUG_,/* Default level */ SU_LOG_MAX,/* Maximum log level */ 0, default_logger, NULL}};从上述代码可以看出,su_log_default的名称是“sofia”,可使用的日志等级环境变量是SOFIA_DEBUG,缺省日志等级由SOFIA_DEBUG_宏决定。更关键一点是,日志输出函数确定是default_logger。可惜这里还是没看到指定stream。
static void default_logger(void *stream, char const *fmt, va_list ap){ FILE *f = stream ? (FILE *)stream : stderr; vfprintf(f, fmt, ap);}由日志输出函数定义可看出,缺省会使用stderr作为输出流。
su_global_log.c文件内主要内容如下:
extern char const SU_DEBUG[];#endif#ifdef SU_DEBUG#define SU_DEBUG_ SU_DEBUG#else#define SU_DEBUG_ 3#endif/**Debug log for @b su module. * * The su_log_global is the log object used by @b su module. The level of * #su_log_global is set using #SU_DEBUG environment variable. */su_log_t su_log_global[1] = {{ sizeof(su_log_t), "su", "SU_DEBUG", SU_DEBUG_, SU_LOG_MAX, 0, NULL, NULL}};如上述代码所示,su_log_global的目的是让缺省日志输出有个出口,虽然这个出口没任何作用:因为它没有实际的输出函数。
至此,终于搞明白了su提供的基础日志服务中su_log_default和su_log_global两个变量何时被详细初始化。同时,也搞明白了c库向上层应用提供基础服务时该采用什么样的设计策略。
简单总结下:
1、su_log文件提供日志基础构件;
2、su_debug.h文件提供各个模块自身使用日志服务所需的SU_DEBUG_0至SU_DEBUG_9宏;
3、su_module_debug文件提供su模块自身使用基础日志服务所需的宏;
4、su_default_log和su_global_log文件初始化su_log_default和su_log_global变量;
5、其他模块使用日志基础服务,必须首先用自身的su_log_t结构体变量重定义SU_LOG,然后再包括su_debug.h头文件。
0 0
- 阅读Sofia-SIP源码 - su模块 - su_default_log.c/su_global_log.c
- 阅读Sofia-SIP源码 - su模块 - su.c
- 阅读Sofia-SIP源码 - su模块 - su_log.c/su_log.h
- 阅读Sofia-SIP源码 - su模块 - su_alloc.c/h
- 阅读Sofia-SIP源码 - su模块 - su.h
- 阅读Sofia-SIP源码 - su模块 - su_debug.h/su_module_debug.h
- 阅读Sofia-SIP源码 - su模块 - su_configure.h/su_config.h/su_types.h
- freeswitch源码阅读 之 sofia模块
- 阅读Sofia-SIP源码三 源码文件结构
- 阅读Sofia-SIP源码一 全局宏定义
- Sofia-SIP辅助文档二 - C语言代码风格指南
- 阅读Sofia-SIP源码五 源码文件文档化的注释
- Sofia-SIP辅助文档七 - Sofia SIP用户代理库 - "su" - 操作系统功能和工具
- 阅读Sofia-SIP源码二 源代码中包含自身项目中头文件方式
- Sofia-SIP辅助文档十五 - Sofia SIP用户代理库 - "sip" - SIP解析模块
- Sofia-SIP辅助文档十一 - Sofia SIP用户代理库 - "nea" - SIP事件模块
- Sofia-SIP辅助文档十三 - Sofia SIP用户代理库 - "nta" - SIP事务模块
- Sofia-SIP
- Java——二分折半查找法
- POJ3616
- ios某一个屏幕支持旋转,其他不支持的方法
- MySQL Administrator
- Uncaught TypeError: Cannot read property 'width' of undefined
- 阅读Sofia-SIP源码 - su模块 - su_default_log.c/su_global_log.c
- Swift中网络单例类封装
- 构建ZooKeeper应用
- NodeJs forEach循环
- ZooKeeper管理分布式环境中的数据
- 不错的一款国产弹出js插件Layer
- fedora14安装
- js中typeof用法详细介绍及NaN、 null 及 undefined 的区别
- 迭代硬阈值(IHT)的补充说明