搜索
bottom↓
回复: 57
打印 上一主题 下一主题

【升级】C/C++ 日志库 EasyLogger 新增彩色日志、异步输出等

  [复制链接]

出0入198汤圆

跳转到指定楼层
1
发表于 2016-11-14 20:16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunnydragon 于 2016-11-14 21:44 编辑

EasyLogger 是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。 EasyLogger 功能简单,上手速度快,更多实用功能支持以插件形式进行动态扩展。
主要特性
  • 支持用户自定义输出方式(例如:终端、文件、数据库、串口、485、Flash...);
  • 日志内容可包含级别、时间戳、线程信息、进程信息等;
  • 日志输出被设计为线程安全的方式,并支持 异步输出缓冲输出 模式;
  • 支持多种操作系统(RT-Thread、UCOS、Linux、Windows...),也支持裸机平台;
  • 日志支持 RAW格式 ;
  • 支持按 标签 、 级别 、 关键词 进行动态过滤;
  • 各级别日志支持不同颜色显示
  • 扩展性强,支持以插件形式扩展新功能。

本次更新版本号 V1.11.13,主要发布以下重要功能:

1、新增彩色日志
所有级别日志可独立设置颜色,错误信息更加明显,日志更加赏心悦目,进一步提升调试效率。详细使用方法,请参照说明文档(点击查看)。Linux Demo 里已经默认开启了此功能,大致效果如下,欢迎试用

点击查看 在 xshell 上显示彩色串口日志的配置方法

2、新增异步输出模式(非阻塞输出模式)
之前的版本默认为阻塞的同步输出模式,即用户线程输出日志时,日志必须完全输出到输出介质(串口、网络、文件等)上,输出过程才会退回。
这样会影响应用软件执行时间及执行效率。开启异步输出模式后,后台有专门的日志线程负责完成日志输出功能,应用程序输出日志时,底层只将日志拷贝至缓冲区后,随即退出日志输出方法。

异步输出默认使用 POSIX pthread 实现,对于 Windows 、Liunx 、RT-Thread 及其他支持 POSIX pthread 的用户,只需开启异步输出相关配置,即可开启此功能。
对于缺少 pthread 支持的平台,例如:ucos ,也可以参考 elog_async.c 中关于异步输出线程的实现方式,自己动手实现。
PS:Linux  Demo 中已开启 pthread 异步输出模式,RT-Thread Demo 已使用其线程相关 API 实现异步输出模式。

3新增缓冲输出模式
开启缓冲输出模式后,如果缓冲区不满,用户线程在进行日志输出时,无需等待日志彻底输出完成,即可直接返回。
但当日志缓冲区满以后,将会占用当前用户线程,自动将缓冲区中的日志全部输出干净。
同时用户也可以在其他非用户线程,通过定时等机制使用 `void elog_flush(void)` 将缓冲区中的日志输出干净。


下载方式
最新版请关注 GitHubhttps://github.com/armink/EasyLogger
本坛下载:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
发表于 2016-11-14 20:23:45 | 只看该作者
占一楼,顶!!!

出0入0汤圆

3
发表于 2016-11-14 20:55:18 | 只看该作者
占二楼,顶!!!

出0入0汤圆

4
发表于 2016-11-14 21:21:42 来自手机 | 只看该作者
占三楼,顶!!!

出0入0汤圆

5
发表于 2016-11-14 21:33:32 | 只看该作者

占四楼,顶!!!

出40入42汤圆

6
发表于 2016-11-14 21:48:05 | 只看该作者
占五楼,恭喜楼主又升级了这个开源项目。

出0入0汤圆

7
发表于 2016-11-14 21:51:05 来自手机 | 只看该作者
显示颜色是怎么实现的?

出0入90汤圆

8
发表于 2016-11-15 00:51:30 | 只看该作者
好牛逼的东西,这个在资源丰富的芯片下面,可以直接使用;

出0入0汤圆

9
发表于 2016-11-15 08:08:14 | 只看该作者
闪存库现在可以作为数据保存组件使用了吗,就是频繁的保存很多用户参数

出0入8汤圆

10
发表于 2016-11-15 08:46:42 | 只看该作者
本帖最后由 security 于 2016-11-15 09:01 编辑
love_zjb 发表于 2016-11-14 21:51
显示颜色是怎么实现的?


我猜是基于 ANSI/VT100 之类的虚拟终端控制协议。
我自己的 logger 是这么实现的。

出0入0汤圆

11
发表于 2016-11-15 10:09:27 | 只看该作者
不错,谢谢楼主

出0入0汤圆

12
发表于 2016-11-15 10:53:49 | 只看该作者
love_zjb 发表于 2016-11-14 21:51
显示颜色是怎么实现的?

你搜索下\033,我在putty下都是这么用的

出0入198汤圆

13
 楼主| 发表于 2016-11-15 20:29:06 | 只看该作者
love_zjb 发表于 2016-11-14 21:51
显示颜色是怎么实现的?

这个参照 ANSI 的一个标准,详见维基百科:https://en.wikipedia.org/wiki/ANSI_escape_code

出0入198汤圆

14
 楼主| 发表于 2016-11-15 20:31:15 | 只看该作者
honami520 发表于 2016-11-15 00:51
好牛逼的东西,这个在资源丰富的芯片下面,可以直接使用;

不用很丰富的资源,支持嵌入式操作系统的产品,支持这些功能会更加轻松。

出0入198汤圆

15
 楼主| 发表于 2016-11-15 20:33:29 | 只看该作者
myxiaonia 发表于 2016-11-15 08:08
闪存库现在可以作为数据保存组件使用了吗,就是频繁的保存很多用户参数


没太听明白你说的这个“数据保存组件”具体指的什么?

出0入198汤圆

16
 楼主| 发表于 2016-11-15 20:34:47 | 只看该作者
security 发表于 2016-11-15 08:46
我猜是基于 ANSI/VT100 之类的虚拟终端控制协议。
我自己的 logger 是这么实现的。 ...

是的,这个是 ANSI 的一个标准。

出0入0汤圆

17
发表于 2016-11-16 07:17:52 | 只看该作者
sunnydragon 发表于 2016-11-15 20:33
没太听明白你说的这个“数据保存组件”具体指的什么?

恩 恩 ,就是类似于把闪存当作eeprom来用

出0入0汤圆

18
发表于 2016-11-16 08:44:19 | 只看该作者
编译失败
static const char *level_output_info[] = {
        [ELOG_LVL_ASSERT]  = "A/",
        [ELOG_LVL_ERROR]   = "E/",
        [ELOG_LVL_WARN]    = "W/",
        [ELOG_LVL_INFO]    = "I/",
        [ELOG_LVL_DEBUG]   = "D/",
        [ELOG_LVL_VERBOSE] = "V/",
};
/* color output info */
static const char *color_output_info[] = {
        [ELOG_LVL_ASSERT]  = ELOG_COLOR_ASSERT,
        [ELOG_LVL_ERROR]   = ELOG_COLOR_ERROR,
        [ELOG_LVL_WARN]    = ELOG_COLOR_WARN,
        [ELOG_LVL_INFO]    = ELOG_COLOR_INFO,
        [ELOG_LVL_DEBUG]   = ELOG_COLOR_DEBUG,
        [ELOG_LVL_VERBOSE] = ELOG_COLOR_VERBOSE,
};

///////////////
..\..\..\..\easylogger\src\elog.c(116): error:  #29: expected an expression

出0入8汤圆

19
发表于 2016-11-16 08:59:17 | 只看该作者
hanzo852 发表于 2016-11-16 08:44
编译失败
static const char *level_output_info[] = {
        [ELOG_LVL_ASSERT]  = "A/",

这种问题,我猜原因:多数是没打开 C99 编译选项,
请打开对 C99 的支持,再试下。

出0入0汤圆

20
发表于 2016-11-16 09:48:42 | 只看该作者
hanzo852 发表于 2016-11-16 08:44
编译失败
static const char *level_output_info[] = {
        [ELOG_LVL_ASSERT]  = "A/",

打开工程options for target's stm32f103xE,在 Misc Control一栏空白处添加--c99,再重新编译一下

出0入198汤圆

21
 楼主| 发表于 2016-11-16 18:53:53 | 只看该作者
hanzo852 发表于 2016-11-16 08:44
编译失败
static const char *level_output_info[] = {
        [ELOG_LVL_ASSERT]  = "A/",

刚刚在 GitHub 上更新了:https://github.com/armink/EasyLogger ,增强了对 Keil4 的兼容性。

默认用 keil5 打开编译是不会有问题,估计你是用的 keil4 吧。

Keil 5 有个 C99 单选框(如下图),但 Keil4 没有。所以 Keil4 需要在 Misc Controls 里增加: --C99 选项

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入198汤圆

22
 楼主| 发表于 2016-11-16 18:56:52 | 只看该作者
myxiaonia 发表于 2016-11-16 07:17
恩 恩 ,就是类似于把闪存当作eeprom来用


那你可以使用 EasyFlash :https://github.com/armink/EasyFlash

然后参考文档(点击查看),开启 磨损(擦写)平衡模式 ,应该能满足你的需求。

出0入0汤圆

23
发表于 2016-11-16 22:43:03 | 只看该作者
sunnydragon 发表于 2016-11-16 18:56
那你可以使用 EasyFlash :https://github.com/armink/EasyFlash

然后参考文档(点击查看),开启 磨损 ...

我特意去看了你的easyflash中env的实现方法,每个env是作为整体进行操作的,当然擦写平衡后我估计会使用类似fat32文件系统的做法,就是扇区顺序使用,类似于环形队列一样,但是这应该是对一个个env之间的做法

对于大量数据集合的形式用现在的env不大合适,因为修改很可能是其中一个字节,也可能是几kb这样的,如果将这个大数据集合拆分为多个互不相干的env,某些操作比如清空同一组参数就需要操作n次,而数据集合中
这些数据都是连续存放的,一条语句就完成了,用一个env的话,修改一个自己也写一遍整个env又太奢侈

有没有可能只对修改部分保存,但是开机读取这个env时又能准备的恢复过来

出0入0汤圆

24
发表于 2016-11-16 22:49:55 | 只看该作者
我自己现在的做法,大数据集合动态保存的做法,每次修改则记录偏移地址和长度,然后写入到flash,当然各种校验机制和写入策略都是有考虑的

出0入198汤圆

25
 楼主| 发表于 2016-11-17 07:42:55 | 只看该作者
myxiaonia 发表于 2016-11-16 22:49
我自己现在的做法,大数据集合动态保存的做法,每次修改则记录偏移地址和长度,然后写入到flash,当然各种 ...

是的,EasyFlash 现有实现方式虽然简单,但是针对大数据支持资源占用会非常高,所以目前还不太适合这类场景。

最近一直业余时间一直在忙 EasyLogger 的开发,在 EasyFlash 的后续开发计划中,会新增一种轻量级模式,所有数据无需再开辟内存进行缓存,保存在 Flash 的数据会使用压缩算法进行压缩,Env 的名字不在采用字符串存储等等很多降低系统资源占用的处理,欢迎继续关注 EasyFlash 的进展哈~

出0入13汤圆

26
发表于 2016-11-17 08:49:35 来自手机 | 只看该作者
不错不错,好资源

出0入198汤圆

27
 楼主| 发表于 2016-11-20 21:03:32 | 只看该作者
weiwei4 发表于 2016-11-17 08:49
不错不错,好资源

出0入0汤圆

28
发表于 2016-11-20 21:32:14 | 只看该作者
非常有帮助,谢了。。。。。。。。

出0入198汤圆

29
 楼主| 发表于 2016-11-29 08:03:26 | 只看该作者
jie5313 发表于 2016-11-20 21:32
非常有帮助,谢了。。。。。。。。

出0入0汤圆

30
发表于 2016-12-2 12:28:00 | 只看该作者
多谢分享~~~~~~~~~··

出0入0汤圆

31
发表于 2016-12-2 14:15:26 来自手机 | 只看该作者
非常好用,赞一个~

出0入0汤圆

32
发表于 2016-12-2 16:52:43 | 只看该作者
正好项目要用到,试试

出0入0汤圆

33
发表于 2016-12-2 19:05:04 | 只看该作者
下载看看,多谢分享!

出0入198汤圆

34
 楼主| 发表于 2016-12-7 09:31:24 | 只看该作者
chxaitz 发表于 2016-12-2 14:15
非常好用,赞一个~

多谢支持哈~

出0入0汤圆

35
发表于 2016-12-25 23:32:28 | 只看该作者
这个帖子  我继续再顶!

出20入0汤圆

36
发表于 2016-12-25 23:43:09 | 只看该作者
谢谢分享,高质量的资料。

出0入0汤圆

37
发表于 2017-1-22 15:09:31 | 只看该作者
Linux下怎么加到自己的进程中。需要把整个源码全部加入?

出0入198汤圆

38
 楼主| 发表于 2017-1-23 10:40:55 | 只看该作者
miaoguoqiang 发表于 2017-1-22 15:09
Linux下怎么加到自己的进程中。需要把整个源码全部加入?

是的,你可以先试一下 Linux 的 Demo

出0入0汤圆

39
发表于 2017-1-24 09:14:06 | 只看该作者
可以,关注下!

出0入0汤圆

40
发表于 2017-5-15 14:36:33 | 只看该作者
本帖最后由 miaoguoqiang 于 2017-5-15 14:38 编辑

没看到linux下对日志的分割处理,相对于log4c,觉得log4c使用起来比较便捷

出0入0汤圆

41
发表于 2017-5-16 09:59:26 | 只看该作者
相当给力,赞!

出0入0汤圆

42
发表于 2017-5-19 10:43:29 | 只看该作者
标记一下 以后方便查找

出0入0汤圆

43
发表于 2017-8-14 05:33:55 | 只看该作者
可以移植到freertos中吗?

出0入198汤圆

44
 楼主| 发表于 2017-8-14 08:09:37 | 只看该作者
游在云间 发表于 2017-8-14 05:33
可以移植到freertos中吗?

当然可以。可以参考下其他 OS 的 Demo 。

出0入0汤圆

45
发表于 2017-11-11 14:26:12 | 只看该作者
非常好,方便故障跟踪

出0入0汤圆

46
发表于 2019-4-2 16:00:52 | 只看该作者
请问在移植easyLogger时,keil5.17环境,编译时报错,是什么原因呢?
static const char *level_output_info[] = {
        [ELOG_LVL_ASSERT]  = "A/",
        [ELOG_LVL_ERROR]   = "E/",
        [ELOG_LVL_WARN]    = "W/",
        [ELOG_LVL_INFO]    = "I/",
        [ELOG_LVL_DEBUG]   = "D/",
        [ELOG_LVL_VERBOSE] = "V/",
};

..\Module\easyflash\src\elog.c(118): error:  #29: expected an expression

出0入198汤圆

47
 楼主| 发表于 2019-4-2 16:04:39 | 只看该作者
Baldwin 发表于 2019-4-2 16:00
请问在移植easyLogger时,keil5.17环境,编译时报错,是什么原因呢?
static const char *level_output_inf ...

keil 里开启 C99 支持就好了

出0入0汤圆

48
发表于 2019-4-2 16:08:24 | 只看该作者
sunnydragon 发表于 2019-4-2 16:04
keil 里开启 C99 支持就好了

可以了,谢谢

出0入0汤圆

49
发表于 2019-4-3 09:22:55 | 只看该作者
按照github上移植手册进行了移植,https://github.com/armink/EasyLo ... cs/zh/port/flash.md
为什么elog_flash.c中还需要调用easyflash.c easyflash.h?能否介绍一下文件调用方式和移植,谢谢

出250入8汤圆

50
发表于 2019-4-3 15:07:27 | 只看该作者
好东西,标记下

出0入0汤圆

51
发表于 2019-12-5 19:00:08 | 只看该作者
厉害了!

出0入0汤圆

52
发表于 2019-12-5 22:47:56 来自手机 | 只看该作者
好东西,收藏先

出0入0汤圆

53
发表于 2019-12-9 13:51:31 | 只看该作者
好东西,做个记号。

出110入12汤圆

54
发表于 2020-4-30 10:47:23 | 只看该作者
简单移植了一下,效果挺好!还要请教楼主两个问题:
1.好像不支持打印很长的带换行的字符串?比如像下面图片这样的。按我理解需要把这个logo存到一个大数组里,再用easylogger打印,我试了一下只能打印一部分,也不会换行。
2.easylogger没有输入命令的功能吧?比如在SecureCRT里用键盘做交互。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入198汤圆

55
 楼主| 发表于 2020-4-30 20:48:36 | 只看该作者
hall 发表于 2020-4-30 10:47
简单移植了一下,效果挺好!还要请教楼主两个问题:
1.好像不支持打印很长的带换行的字符串?比如像下面图 ...

1、这种其实按行打印就好,每一行对应一个日志代码
2、elog 主要负责日志输出,命令输入,还是得依赖于其他组件

出110入12汤圆

56
发表于 2020-5-1 00:34:45 | 只看该作者
sunnydragon 发表于 2020-4-30 20:48
1、这种其实按行打印就好,每一行对应一个日志代码
2、elog 主要负责日志输出,命令输入,还是得依赖于其 ...

懂了,感谢作者回复!

出0入0汤圆

57
发表于 2020-5-1 00:44:57 | 只看该作者
不错 不错

出0入0汤圆

58
发表于 2020-12-31 16:45:06 | 只看该作者
好东西啊,赶紧研究一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表