嵌⼊式linux⽇志库移植,C开源⽇志库EasyLogger移植和封装
使⽤
槐木可以做防腐木吗1、写在最前:
开源⽇志库EasyLogger使⽤c语⾔编写,及其简便和通⽤,感谢EasyLogger作者armink的贡献。
复印机碳粉2、代码地址:
3、许可
MIT Copyright (c) [email protected]
4、介绍:
EasyLogger 是⼀款超轻量级(ROM<1.6K, RAM<0.3K)、⾼性能的C⽇志库,⾮常适合对资源敏感的软件项⽬,例如:IoT产品、可穿戴设备、智能家居等等。相⽐log4c、zlog这些知名的C⽇志库,EasyLogger的功能更加简单,提供给⽤户的接⼝更少,但上⼿会很快,更多实⽤功能⽀持以插件形式进⾏动态扩展。
5、主要特性
⽀持⽤户⾃定义输出⽅式(例如:终端、⽂件、数据库、串⼝、485、); ⽇志内容可包含级别、时间戳、线程信息、进程信息等; 氟橡胶成分分析
⽇志输出被设计为线程安全的⽅式;
⽀持多种操作系统(RT-Thread、UCOS、Linux、),也⽀持裸机平台;
⽇志⽀持RAW格式;
各级别⽇志⽀持不同颜⾊显⽰;
扩展性强,⽀持以插件形式扩展新功能。
名词解释:
1、RAW格式:未经过格式化的原始⽇志。
2、标签:在软件中可以按照⽂件、模块、功能等⽅⾯,对需要打印的⽇志设定标签,实现⽇志分类。
6、插件
1、Flash:使⽤EasyFlash库提供的Flash操作接⼝,可以把⽇志直接存储在Flash中。
2、File:⽀持⽂件转档、软件运⾏时动态加载配置⽂件等与⽂件⽇志输出相关功能。
7、参数配置
EasyLogger拥有过滤⽅式、输出格式、输出开关这些属性。 过滤⽅式⽀持按照标签、级别、关键词进⾏过滤;
可以动态的开启/关闭⽇志的输出;
可设定动态和静态的输出级别(静态:⼀级开关,通过宏定义;动态:⼆级开关,通过API接⼝)
8、输出级别
参考Android Logcat,级别最⾼为0(Assert),最低为5(Verbose)。
0.[A]:断⾔(Assert)
1.[E]:错误(Error)
2.[W]:警告(Warn)
3.[I]:信息(Info)
4.[D]:调试(Debug)
5.[V]:详细(Verbose)
8.1 各个级别⽇志默认颜⾊效果如下。⽤户也可以根据⾃⼰的喜好,在 elog_cfg.h 对各个级别⽇志的颜⾊及字体风格进⾏单独设置。
8.2输出过滤
⽀持按照级别、标签及关键词进⾏过滤。⽇志内容较多时,使⽤过滤功能可以更快定位⽇志,保证⽇志的可读性。更多的过滤功能设置⽅法及细节请阅读\docs\zh\api\kernel.md⽂档。
8.3 输出格式
输出格式⽀持:级别、时间、标签、进程信息、线程信息、⽂件路径、⾏号、⽅法名。每种优先级别可以独⽴设置输出格式。
注:默认为RAW格式,RAW格式⽇志不⽀持标签过滤
8.4 输出⽅式
通过⽤户的移植,可以⽀持任何⼀种输出⽅式。只不过对于某种输出⽅式可能引⼊的新功能,需要通过插件实现,例如:⽂件转存,检索Flash⽇志等等。后期会有更多的插件开源出来。下⾯简单对⽐下部分输出⽅式使⽤场景:
终端:⽅便⽤户动态查看,不具有存储功能;
⽂件与Flash:都具有存储功能,⽤户可以查看历史⽇志。但是⽂件⽅式需要⽂件系统的⽀持,⽽Flash⽅式更加适合应⽤在⽆⽂件系统的⼩型嵌⼊式设备中。
9、移植
因为在linux下使⽤,所以直接进⼊EasyLogger\EasyLogger\demo\os\linux下测试即可
Demo路径:\demo\os\rt-thread\stm32f10x\
API⽂档:\docs\zh\api\kernel.md
螺母
移植⽂档:\docs\zh\port\kernel.md
10、遇到的问题:
1、⽂件和控制台的开关问题,可以整体开关,没有单⼀开关
led日光管
2、级别、过滤策略不能动态控制
解决办法:创建全局flag,写⼀个配置⽂件,开⼀个线程处理,检查⽂件的状态,读取⽂件内容,⽂件中包含问题1和问题2中的参数。
11、接⼝说明:
API:
elog_set_filter(uint8_t level, const char *tag, const char *keyword); //参数1:要过滤的级别,参数2:要过滤的标签,参数3:要过滤的关键字
elog_set_filter_tag_lvl("test", ELOG_LVL_WARN); //参数1:要过滤的标签(线程/进程名/模块名)。 参数2:对指定标签过滤,设置显⽰级别,低于此级别不再显⽰
elog_set_filter_tag(const char *tag); //参数1:要过滤的标签
elog_set_filter_kw("EasyLogger"); //参数1:要过滤的关键字,所有log中带有关键字的log才会显⽰
elog_set_filter_lvl(ELOG_LVL_WARN); //参数1:要过滤的级别,低于此级别的log不显⽰
elog_set_output_enabled(true); //参数1:开关,控制log是否打印的开关,全局的,包含⽂件和console
标本夹elog_start(); //这⾥默认启动总开关,默认启动异步输出⽅式,默认启动缓冲输出⽅式
elog_init(); //log初始化
setbuf(stdout, NULL); //关闭 printf 缓冲机制
elog_set_text_color_enabled(true); //打开颜⾊选项
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME); //设置不同级别所显⽰的格式,这⾥有⼀个枚举来控制
elog_a("tag","Hello hahah"); //每次需要传⼊tag
log_a("hello"); //tag通过宏设置在头⽂件上⾯
/* all formats index */
typedef enum {
ELOG_FMT_LVL = 1 << 0, /**< level */
ELOG_FMT_TAG = 1 << 1, /**< tag */
ELOG_FMT_TIME = 1 << 2, /**< current time */
ELOG_FMT_P_INFO = 1 << 3, /**< process info */
ELOG_FMT_T_INFO = 1 << 4, /**< thread info */
ELOG_FMT_DIR = 1 << 5, /**< file directory and name */
ELOG_FMT_FUNC = 1 << 6, /**< function name */
ELOG_FMT_LINE = 1 << 7, /**< line number */
} ElogFmtIndex;
12、规格,每⾏输出最长字符,ELOG_LINE_BUF_SIZE=512最⼤
过滤标签最⼤长度,ELOG_FILTER_TAG_MAX_LEN=16
过滤关键词最⼤长度,ELOG_FILTER_KW_MAX_LEN=16
过滤器数⽬, 暂时仅⽀持⼀个
13、demo测试完毕后,移植到⼯程中封装⾃⼰的接⼝即可使⽤