前言:一个好的库(对开发者友好),一定有一个好的日志系统,可以帮助developer快速的定位问题。
今天我们对比一下ffmpeg和SDL两个开源库开放的日志回调接口,看看各自的优缺点,对实现一个我们自己的lib也是有益的
多说无益,直接开始
接口一览表
ffmpeg | SDL |
int av_log_get_level(void); | extern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category); |
void av_log_set_level(int level); | extern DECLSPEC void SDLCALL SDL_LogSetPriority(int category,SDL_LogPriority priority); extern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority); |
void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)); | extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata); extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata); |
void av_log_default_callback(void *avcl, int level, const char *fmt,va_list vl); | extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void); |
void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, char *line, int line_size, int *print_prefix); | |
int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, char *line, int line_size, int *print_prefix); | |
void av_log_set_flags(int arg); | |
int av_log_get_flags(void); |
红色部分是日志回调的基本接口,SDL get接口较为丰富
ffmpeg多了一些日志输出到文件的接口。之所以多了这些接口,是因为ffmpeg既可以作为库使用,也可以作为进程存在。SDL仅作为lib使用
日志等级/类别
ffmpeg | SDL |
AV_LOG_QUIET /*不输出日志*/ | SDL_LOG_PRIORITY_VERBOSE |
AV_LOG_PANIC /*不知道和FATAL的区别是什么*/ | SDL_LOG_PRIORITY_DEBUG |
AV_LOG_FATAL | SDL_LOG_PRIORITY_INFO |
AV_LOG_ERROR | SDL_LOG_PRIORITY_WARN |
AV_LOG_WARNING | SDL_LOG_PRIORITY_ERROR |
AV_LOG_INFO | SDL_LOG_PRIORITY_CRITICAL |
AV_LOG_VERBOSE | SDL_NUM_LOG_PRIORITIES /*ALL*/ |
AV_LOG_DEBUG | |
AV_LOG_TRACE | |
AV_LOG_MAX_OFFSET /*ALL*/ |
SDL支持针对不同的日志类别设置日志级别,SDL自己抽象出来
SDL_LOG_CATEGORY_APPLICATION,
SDL_LOG_CATEGORY_ERROR,
SDL_LOG_CATEGORY_ASSERT,
SDL_LOG_CATEGORY_SYSTEM,
SDL_LOG_CATEGORY_AUDIO,
SDL_LOG_CATEGORY_VIDEO,
SDL_LOG_CATEGORY_RENDER,
SDL_LOG_CATEGORY_INPUT,
SDL_LOG_CATEGORY_TEST
这些日志的类别,并在记录日志时选择一类进行归类。简单总结就是最后这条日志是由两个条件决定是否会输出的,一个是日志的类别,一个是日志的优先级,两者同时作用后&条件生效
比如,可以设置VIDEO的info级别日志进行输出,但是AUDIO的info级别不输出。
回调的参数
ffmpeg不支持回调用户自定义的参数,默认是ffmpeg进行填充一个AVClass*的参数回调给上层。ffmpeg可以将format回调给上层应用,上层应用可以做过滤等操作
SDL允许用户自定义一个void *userdata,并且在回调的时候传给上层,SDL回调给上层的log只有char*格式,不支持上层用户直接根据format再加工
思考
- 作为一个lib时,一般不会有主动输出日志到terminal或者到文件的操作。因为被调用时,仅通过lib自己的操作日志不能很方便的反映出实际业务的流程,需要配合调用放自己的log进行分析。上层应用通过回调lib日志进行log存储
- 丰富lib API函数返回值,让上层应用直观通过返回值可以清楚的了解到错误的原因