Delete docs directory

pull/109/head
removedporn 4 years ago committed by GitHub
parent e1fdb134db
commit 7a44595a07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1 +0,0 @@
# Coming soon...

Binary file not shown.

Before

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

@ -1,3 +0,0 @@
|File name |Description|
|:----- |:----|
|api.md |API description|

@ -1,4 +0,0 @@
|File or folder name |Description|
|:----- |:----|
|en |English documents|
|zh |中文文档(简体)|

@ -1,110 +0,0 @@
# EasyLogger Flash 插件 API 说明
---
所有Flash插件功能的API接口都在[`\easylogger\plugins\flash\elog_flash.h`](https://github.com/armink/EasyLogger/blob/master/easylogger/plugins/flash/elog_flash.h)中声明。以下内容较多,可以使用 **CTRL+F** 搜索。
> 建议:点击项目主页 https://github.com/armink/EasyLogger 右上角 **Watch & Star**,这样项目有更新时,会及时以邮件形式通知你。
## 1、用户使用接口
### 1.1 初始化
初始化的EasyLogger的Flash插件初始化后才可以使用下面的API。
> 注意:插件的初始化必须放在核心功能初始化之后。
```
ElogErrCode elog_flash_init(void)
```
### 1.2 输出Flash中指定位置存储的日志
日志的输出方式取决用户的移植接口`elog_flash_port_putput`的实现具体参考Flash插件移植说明[`\docs\zh\port\flash.md`](https://github.com/armink/EasyLogger/blob/master/docs/zh/port/flash.md)。首页Demo中是输出到控制台的方式。
```
void elog_flash_output(size_t pos, size_t size)
```
|参数 |描述|
|:----- |:----|
|pos |日志存储的位置索引从0开始|
|size |日志大小,单位:字节|
### 1.3 输出Flash中存储的所有日志
```
void elog_flash_output_all(void)
```
### 1.4 输出Flash中最近存储的日志
```
void elog_flash_output_recent(size_t size)
```
|参数 |描述|
|:----- |:----|
|size |日志大小,单位:字节|
### 1.5 往Flash中写入日志
此方法可以放到核心功能的日志输出移植接口`elog_port_output`中实现所有日志自动保存至Flash中的功能。
```
void elog_flash_write(const char *log, size_t size)
```
|参数 |描述|
|:----- |:----|
|log |日志内容|
|size |日志大小,单位:字节|
### 1.6 清空Flash中全部日志
> 注意如果Flash插件开启缓冲模式那么缓冲区的日志也将会被清空。
```
void elog_flash_clean(void)
```
### 1.7 使能/失能Flash日志功能锁
默认为使能状态当系统或MCU进入异常后需要输出异常日志时就必须失能Flash日志功能锁来保证异常日志能够被正常输出。
```
void elog_flash_lock_enabled(bool enabled)
```
|参数 |描述|
|:----- |:----|
|enabled |true: 使能false: 失能|
例子:
```c
/* EasyLogger断言钩子方法 */
static void elog_user_assert_hook(const char* ex, const char* func, size_t line) {
/* 失能日志输出锁 */
elog_output_lock_enabled(false);
/* 失能EasyLogger的Flash插件自带同步锁Flash插件自带方法 */
elog_flash_lock_enabled(false);
/* 输出断言信息 */
elog_a("elog", "(%s) has assert failed at %s:%ld.\n", ex, func, line);
/* 将缓冲区中所有日志保存至FlashFlash插件自带方法 */
elog_flash_flush();
while(1);
}
```
### 1.8 将缓冲区中所有日志保存至Flash中
> 注意只有Flash插件开启缓冲模式时此功能才可以被使用。非缓冲模式下调用`elog_flash_write()`会立刻保存日志。
```
void elog_flash_flush(void);
```
## 2、配置
参照EasyLogger Flash插件移植说明[`\docs\zh\port\flash.md`](https://github.com/armink/EasyLogger/blob/master/docs/zh/port/flash.md))中的 `设置参数` 章节

@ -1,434 +0,0 @@
# EasyLogger 核心功能 API 说明
---
所有核心功能API接口都在[`\easylogger\inc\elog.h`](https://github.com/armink/EasyLogger/blob/master/easylogger/inc/elog.h)中声明。以下内容较多,可以使用 **CTRL+F** 搜索。
> 建议:点击项目主页 https://github.com/armink/EasyLogger 右上角 **Watch & Star**,这样项目有更新时,会及时以邮件形式通知你。
## 1、用户使用接口
### 1.1 初始化
初始化的 EasyLogger 的核心功能初始化后才可以使用下面的API。
```
ElogErrCode elog_init(void)
```
### 1.2 启动
**注意**:在初始化完成后,必须调用启动方法,日志才会被输出。
```
void elog_start(void)
```
### 1.3 输出日志
所有日志的级别关系大小如下:
```
级别 标识 描述
0 [A] 断言(Assert)
1 [E] 错误(Error)
2 [W] 警告(Warn)
3 [I] 信息(Info)
4 [D] 调试(Debug)
5 [V] 详细(Verbose)
```
#### 1.3.1 输出基本日志
所有级别的日志输出方法如下,每种级别都有两种简化方式,用户可以自行选择。
```c
#define elog_assert(tag, ...)
#define elog_a(tag, ...) //简化方式1每次需填写 LOG_TAG
#define log_a(...) //简化方式2LOG_TAG 已经在文件顶部定义,使用前无需填写 LOG_TAG
#define elog_error(tag, ...)
#define elog_e(tag, ...)
#define log_e(...)
#define elog_warn(tag, ...)
#define elog_w(tag, ...)
#define log_w(...)
#define elog_info(tag, ...)
#define elog_i(tag, ...)
#define log_i(...)
#define elog_debug(tag, ...)
#define elog_d(tag, ...)
#define log_d(...)
#define elog_verbose(tag, ...)
#define elog_v(tag, ...)
#define log_v(...)
```
|参数 |描述|
|:----- |:----|
|tag |日志标签|
|... |不定参格式,与`printf`入参一致,放入将要输出日志|
**技巧一** :对于每个源代码文件,可以在引用 `elog.h` 上方,根据模块的不同功能,定义不同的日志标签,如下所示,这样既可直接使用 `log_x` 这类无需输入标签的简化方式 API 。
```c
//WiFi 协议处理(位于 /wifi/proto.c 源代码文件)
#define LOG_TAG "wifi.proto"
#include <elog.h>
log_e("我是 wifi.proto 日志");
```
```C
//WiFi 数据打包处理(位于 /wifi/package.c 源代码文件)
#define LOG_TAG "wifi.package"
#include <elog.h>
log_w("我是 wifi.package 日志");
```
```C
//CAN 命令解析(位于 /can/disp.c 源代码文件)
#define LOG_TAG "can.disp"
#include <elog.h>
log_w("我是 can.disp 日志");
```
**技巧二** :为了实现按照模块、子模块作用域来限制日志输出级别的功能,可以按照下面的方式,在模块的头文件中定义以下宏定义:
```C
/**
* Log default configuration for EasyLogger.
* NOTE: Must defined before including the <elog.h>
*/
#if !defined(LOG_TAG)
#define LOG_TAG "xx"
#endif
#undef LOG_LVL
#if defined(XX_LOG_LVL)
#define LOG_LVL XX_LOG_LVL
#endif
```
XX 是模块名称的缩写,该段内容务必定义在 `elog.h` 之前,否则失效;这样做的 **好处** 是,如果模块内的源文件没有定义 TAG ,则会自动引用该段内容中的定义的 TAG 。同时可以在 头文件中可以配置 `XX_LOG_LVL` ,这样只会输出比这个优先级高或相等级别的日志。当然 XX_LOG_LVL 这个宏也可以不定义,此时会输出全部级别的日志,定义为 ASSERT 级别,就只剩断言信息了。
此时我们就能够实现 **源文件->子模块->模块->EasyLogger全局** 对于其中任何环节的日志配置及控制。调试时想要查看其中任何环节的日志,或者调整其中的某个环节日志级别,都会非常轻松,极大的提高了调试的灵活性及效率。
#### 1.3.2 输出 RAW 格式日志
```
void elog_raw(const char *format, ...)
```
|参数 |描述|
|:----- |:----|
|format |样式,类似`printf`首个入参|
|... |不定参|
### 1.4 断言
#### 1.4.1 使用断言
EasyLogger自带的断言可以直接用户软件在断言表达式不成立后会输出断言信息并保持`while(1)`,或者执行断言钩子方法,钩子方法的设定参考 [`elog_assert_set_hook`](#114-设置断言钩子方法)。
```
#define ELOG_ASSERT(EXPR)
#define assert(EXPR) //简化形式
```
|参数 |描述|
|:----- |:----|
|EXPR |表达式|
#### 1.4.2 设置断言钩子方法
默认断言钩子方法为空,设置断言钩子方法后。当断言`ELOG_ASSERT(EXPR)`中的条件不满足时,会自动执行断言钩子方法。断言钩子方法定义及使用可以参考上一章节的例子。
```c
void elog_assert_set_hook(void (*hook)(const char* expr, const char* func, size_t line))
```
|参数 |描述|
|:----- |:----|
|hook |断言钩子方法|
### 1.5 日志输出控制
#### 1.5.1 使能/失能日志输出
```
void elog_set_output_enabled(bool enabled)
```
|参数 |描述|
|:----- |:----|
|enabled |true: 使能false: 失能|
#### 1.5.2 获取日志使能状态
```
bool elog_get_output_enabled(void)
```
#### 1.5.3 使能/失能日志输出锁
默认为使能状态当系统或MCU进入异常后需要输出异常日志时就必须失能日志输出锁来保证异常日志能够被正常输出。
```
void elog_output_lock_enabled(bool enabled)
```
|参数 |描述|
|:----- |:----|
|enabled |true: 使能false: 失能|
例子:
```c
/* EasyLogger断言钩子方法 */
static void elog_user_assert_hook(const char* ex, const char* func, size_t line) {
/* 失能异步输出方式(异步输出模块自带方法) */
elog_async_enabled(false);
/* 失能日志输出锁 */
elog_output_lock_enabled(false);
/* 失能 EasyLogger 的 Flash 插件自带同步锁Flash 插件自带方法) */
elog_flash_lock_enabled(false);
/* 输出断言信息 */
elog_a("elog", "(%s) has assert failed at %s:%ld.\n", ex, func, line);
/* 将缓冲区中所有日志保存至 Flash Flash 插件自带方法) */
elog_flash_flush();
while(1);
}
```
### 1.6 日志格式及样式
#### 1.6.1 设置日志格式
每种级别可对应一种日志输出格式,日志的输出内容位置顺序固定,只可定义开启或关闭某子内容。可设置的日志子内容包括:级别、标签、时间、进程信息、线程信息、文件路径、行号、方法名。
> 注:默认为 RAW格式
```
void elog_set_fmt(uint8_t level, size_t set)
```
|参数 |描述|
|:----- |:----|
|level |级别|
|set |格式集合|
例子:
```c
/* 断言:输出所有内容 */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);
/* 错误:输出级别、标签和时间 */
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
/* 警告:输出级别、标签和时间 */
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
/* 信息:输出级别、标签和时间 */
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
/* 调试:输出除了方法名之外的所有内容 */
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
/* 详细:输出除了方法名之外的所有内容 */
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
```
#### 1.6.2 使能/失能日志颜色
日志颜色功能是将各个级别日志按照颜色进行区分默认颜色功能是关闭的。日志的颜色修改方法详见《EasyLogger 移植说明》中的 `设置参数` 章节。
```
void elog_set_text_color_enabled(bool enabled)
```
|参数 |描述|
|:----- |:----|
|enabled |true: 使能false: 失能|
#### 1.6.3 查找日志级别
在日志中查找该日志的级别。查找成功则返回其日志级别,查找失败则返回 -1 。
> **注意** :使用此功能时,请务必保证所有级别的设定的日志格式里均已开启输出日志级别功能,否则会断言错误。
```
int8_t elog_find_lvl(const char *log)
```
|参数 |描述|
|:----- |:----|
|log |待查找的日志缓冲区|
#### 1.6.4 查找日志标签
在日志中查找该日志的标签。查找成功则返回其日志标签及标签长度,查找失败则返回 NULL 。
> **注意** :使用此功能时,首先请务必保证该级别对应的设定日志格式中,已开启输出日志标签功能,否则会断言错误。其次需保证设定日志标签中 **不能包含空格** ,否则会查询失败。
```
const char *elog_find_tag(const char *log, uint8_t lvl, size_t *tag_len)
```
|参数 |描述|
|:----- |:----|
|log |待查找的日志缓冲区|
|lvl |待查找日志的级别|
|tag_len |查找到的标签长度|
### 1.7 过滤日志
#### 1.7.1 设置过滤级别
默认过滤级别为5(详细)用户可以任意设置。在设置高优先级后低优先级的日志将不会输出。例如设置当前过滤的优先级为3(警告),则只会输出优先级别为警告、错误、断言的日志。
```
void elog_set_filter_lvl(uint8_t level)
```
|参数 |描述|
|:----- |:----|
|level |级别|
#### 1.7.2 设置过滤标签
默认过滤标签为空字符串(`""`)即不过滤。当前输出日志的标签会与过滤标签做字符串匹配日志的标签包含过滤标签则该输出该日志。例如设置过滤标签为WiFi则系统中包含WiFi字样标签的WiFi.Bsp、WiFi.Protocol、Setting.Wifi日志都会被输出。
>注RAW格式日志不支持标签过滤
```
void elog_set_filter_tag(const char *tag)
```
|参数 |描述|
|:----- |:----|
|tag |标签|
#### 1.7.3 设置过滤关键词
默认过滤关键词为空字符串(""),即不过滤。检索当前输出日志中是否包含该关键词,包含则允许输出。
> 注对于配置较低的MCU建议不开启关键词过滤默认为不过滤增加关键字过滤将会在很大程度上减低日志的输出效率。实际上当需要实时查看日志时过滤关键词功能交给上位机做会更轻松所以后期的跨平台日志助手开发完成后就无需该功能。
```
void elog_set_filter_kw(const char *keyword)
```
|参数 |描述|
|:----- |:----|
|keyword |关键词|
#### 1.7.4 设置过滤器
设置过滤器后只输出符合过滤要求的日志。所有参数设置方法可以参考上述3个章节。
```
void elog_set_filter(uint8_t level, const char *tag, const char *keyword)
```
|参数 |描述|
|:----- |:----|
|level |级别|
|tag |标签|
|keyword |关键词|
#### 1.7.3 按模块的级别过滤
这里指的**模块**代表一类具有相同标签属性的日志代码。有些时候需要在运行时动态的修改某一个模块的日志输出级别。
```
void elog_set_filter_tag_lvl(const char *tag, uint8_t level);
```
|参数 |描述|
|:----- |:----|
|tag |日志的标签|
|level |设定的日志级别|
参数 level 日志级别可取如下值:
|**级别** |**名称** |
| --------------------- | ---------------- |
| ELOG_LVL_ASSERT | 断言 |
| ELOG_LVL_ERROR | 错误 |
| ELOG_LVL_WARNING | 警告 |
| ELOG_LVL_INFO | 信息 |
| ELOG_LVL_DEBUG | 调试 |
| ELOG_LVL_VERBOSE | 详细 |
| ELOG_FILTER_LVL_SILENT | 静默(停止输出) |
| ELOG_FILTER_LVL_ALL | 全部 |
函数调用如下所示:
| 功能 | 函数调用 |
| ---------------- | ------------------------------ |
| 关闭 `wifi` 模块全部日志 | `elog_set_filter_tag_lvl("wifi", ELOG_FILTER_LVL_SILENT);` |
| 开启 `wifi` 模块全部日志 | `elog_set_filter_tag_lvl("wifi", ELOG_FILTER_LVL_ALL);` |
| 设置 `wifi` 模块日志级别为警告 | `elog_set_filter_tag_lvl("wifi", ELOG_LVL_WARNING);` |
### 1.8 缓冲输出模式
#### 1.8.1 使能/失能缓冲输出模式
```
void elog_buf_enabled(bool enabled)
```
|参数 |描述|
|:----- |:----|
|enabled |true: 使能false: 失能|
#### 1.8.2 将缓冲区中的日志全部输出
在缓冲输出模式下,执行此方法可以将缓冲区中的日志全部输出干净。
```
void elog_flush(void)
```
### 1.9 异步输出模式
#### 1.9.1 使能/失能异步输出模式
```
void elog_async_enabled(bool enabled)
```
|参数 |描述|
|:----- |:----|
|enabled |true: 使能false: 失能|
#### 1.9.2 在异步输出模式下获取日志
在异步输出模式下,如果用户没有启动 pthread 库,此时需要启用额外线程来实现日志的异步输出功能。使用此方法即可获取到异步输出缓冲区中的指定长度的日志。如果设定日志长度小于日志缓冲区中已存在日志长度,将只会返回已存在日志长度。
```C
size_t elog_async_get_log(char *log, size_t size)
```
|参数 |描述|
|:----- |:----|
|log |取出的日志内容|
|size |待取出的日志大小|
#### 1.9.3 在异步输出模式下获取行日志(以换行符结尾)
异步模式下获取行日志与 1.9.2 中的直接获取日志功能类似,只不过这里所获取到的日志内容,必须为 **行日志** (以换行符结尾)格式,为后续的日志按行分析功能提供便利。如果设定日志长度小于日志缓冲区中已存在日志长度,将只会返回日志缓冲区中行日志的长度。如果缓冲区中不存在行日志,将不能保证返回的日志格式是行日志。
```C
size_t elog_async_get_line_log(char *log, size_t size)
```
|参数 |描述|
|:----- |:----|
|log |取出的行日志内容|
|size |待取出的行日志大小|
## 2、配置
参照 《EasyLogger 移植说明》([`\docs\zh\port\kernel.md`](https://github.com/armink/EasyLogger/blob/master/docs/zh/port/kernel.md))中的 `设置参数` 章节

@ -1,4 +0,0 @@
|文件名 |描述|
|:----- |:----|
|flash.md |flash插件API文档|
|kernel.md |核心功能API文档|

Binary file not shown.

Before

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

@ -1,116 +0,0 @@
# EasyLogger Flash插件移植说明
---
## 1、准备工作
在使用Flash插件前保证EasyLogger的核心功能已经在项目中移植成功[移植文档点这里](https://github.com/armink/EasyLogger/blob/master/docs/zh/port/kernel.md))。再确认已下载的源码中存在`\easylogger\plugins\flash`文件夹该文件夹为Flash插件的所有源码。
## 2、导入项目
目前只有STM32F10x平台的RT-Thread系统Demo里面使用了Flash插件如果你的项目与这个Demo平台一致则可以先直接跳过2、3、4章节按照第5章的要求设置参数并运行、验证Demo。验证通过再按照下面的导入项目要求将Demo中的移植文件直接导入到项目中即可。
- 1、打开`\easylogger\plugins\flash`文件夹,内部文件结构如下:
|源文件 |描述 |
|:------------------------------ |:----- |
|elog_flash.c |Flash插件源码|
|elog_flash.h |Flash插件头文件|
|elog_flash_cfg.h |Flash插件配置头文件|
|elog_flash_port.c |Flash插件移植文件|
- 2、将`\easylogger\plugins\flash`下的所有文件拷贝到项目中;
- 3、添加`elog_flash.c`及`elog_flash_port.c`这些文件到项目的编译路径中;
- 4、添加插件所在文件夹到编译的头文件目录列表中
## 3、移植接口
### 3.1 移植初始化
Flash插件移植初始化。初始化Flash插件移植所需的资源等等。
```C
ElogErrCode elog_flash_port_init(void)
```
### 3.2 Flash中的日志被读取后的输出接口
将日志从Flash中读取后调用`elog_flash_outout()`、`elog_flash_outout_all()`及`elog_flash_outout_recent()`进行输出展示时,将会调用此移植接口。可以在里面增加输出到终端、网络等功能。
```C
void elog_flash_port_output(const char *log, size_t size)
```
|参数 |描述|
|:----- |:----|
|log |日志内容|
|size |日志大小|
例子:
```c
void elog_flash_port_output(const char *log, size_t size) {
/* output to terminal */
rt_kprintf("%.*s", size, log);
}
```
### 3.3 资源同步锁-加锁
对日志写入Flash操作进行加锁保证日志在并发写入时的正确性。有操作系统时可以使用获取信号量来加锁裸机时可以通过关闭全局中断来加锁。
```C
void elog_flash_port_lock(void)
```
### 3.4 资源同步锁-解锁
与加锁功能对应。
```C
void elog_flash_port_unlock(void)
```
## 4、设置参数
配置时需要修改项目中的`elog_flash_cfg.h`文件,开启、关闭、修改对应的宏即可。
### 4.1 缓冲模式
开启后需要写入Flash的日志会先存储至RAM缓冲区当缓冲区满时缓冲区中的所有日志将自动写入Flash。如果关闭所有日志在输出时会立刻写入Flash。
- 默认状态:开启
- 操作方法:开启、关闭`ELOG_FLASH_USING_BUF_MODE`宏即可
#### 4.1.1 缓冲区大小
当开启缓冲模式后此配置才会生效单位byte。
- 操作方法:修改`ELOG_FLASH_BUF_SIZE`宏对应值即可
## 5、测试验证
每次使用前,务必核心功能都已经初始化完成,再调用`elog_flash_init()`方法对Flash插件进行初始化保证初始化没问题后再调用`elog_start()`方法启动EasyLogger最后就可以使用Flash插件自带的API方法进行测试。如果使用的RT-Thread的Demo则可以按照[这里的命令要求](https://github.com/armink/EasyLogger/tree/master/demo/os/rt-thread/stm32f10x#22-flash-log将日志保存到flash中)接上finsh串口输入finsh命令即可测试。
摘取自STM32平台下RT-Thread Demo中的初始化过程[点击查看全部](https://github.com/armink/EasyLogger/blob/master/demo/os/rt-thread/stm32f10x/app/src/app_task.c)
```c
/* 初始化EasyFlash及EasyLogger */
if ((easyflash_init() == EF_NO_ERR)&&(elog_init() == ELOG_NO_ERR)) {
/* 设置日志格式 */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL & ~ELOG_FMT_P_INFO);
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_P_INFO));
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_P_INFO));
/* 设置EasyLogger的断言钩子方法 */
elog_assert_set_hook(elog_user_assert_hook);
/* 初始化EasyLogger的Flash 插件 */
elog_flash_init();
/* 启动EasyLogger */
elog_start();
/* 设置RT-Thread提供的硬件异常钩子方法 */
rt_hw_exception_install(exception_hook);
/* 设置RT-Thread断言钩子方法 */
rt_assert_set_hook(rtt_user_assert_hook);
}
```

@ -1,260 +0,0 @@
# EasyLogger 核心功能移植说明
---
## 1、下载源码
[点击此链接](https://github.com/armink/EasyLogger/archive/master.zip)即可直接下载位于Github上的源码。软件版本号位于 `\easylogger\inc\elog.h``ELOG_SW_VERSION` 宏定义。当然你也可以选择使用Git工具直接克隆到本地。
> 建议:点击项目主页 https://github.com/armink/EasyLogger 右上角 **Watch & Star**,这样项目有更新时,会及时以邮件形式通知你。
如果Github下载太慢也可以点击项目位于的国内仓库下载的链接([OSChina](https://git.oschina.net/Armink/EasyLogger/repository/archive?ref=master)|[Coding](https://coding.net/u/armink/p/EasyLogger/git/archive/master))。
## 2、导入项目
在导入到项目前,先打开[`\demo\`](https://github.com/armink/EasyLogger/tree/master/demo)文件夹检查下有没有与项目平台一致的Demo。如果有则先直接跳过2、3、4章节按照第5章的要求设置参数并运行、验证Demo。验证通过再按照下面的导入项目要求将Demo中的移植文件直接导入到项目中即可。
- 1、先解压下载好的源码包文件的目录结构大致如下
|源文件 |描述 |
|:------------------------------ |:----- |
|\easylogger\src\elog.c |核心功能源码|
|\easylogger\src\elog_async.c |核心功能异步输出模式源码|
|\easylogger\src\elog_buf.c |核心功能缓冲输出模式源码|
|\easylogger\src\elog_utils.c |EasyLogger常用小工具|
|\easylogger\port\elog_port.c |不同平台下的EasyLogger移植接口|
|\easylogger\plugins\ |插件源码目录|
|\docs\zh\ |所有中文文档目录|
|\demo\non_os\stm32f10x\ |stm32f10x裸机的 demo|
|\demo\os\linux\ |linux平台 demo|
|\demo\os\windows\ |windows平台 demo|
|\demo\os\rt-thread\stm32f10x\ |stm32f10x基于[RT-Thread](http://www.rt-thread.org/)的demo包含Flash插件demo|
- 2、将`\easylogger\`(里面包含`inc`、`src`及`port`的那个)文件夹拷贝到项目中;
- 3、添加`\easylogger\src\elog.c`、`\easylogger\src\elog_utils.c`及`\easylogger\port\elog_port.c`这些文件到项目的编译路径中elog_async.c 及 elog_buf.c 视情况选择性添加);
- 4、添加`\easylogger\inc\`文件夹到编译的头文件目录列表中;
## 3、移植接口
### 3.1 移植初始化
EasyLogger移植初始化。初始化EasyLogger移植所需的资源等等。
```C
ElogErrCode elog_port_init(void)
```
### 3.2 日志输出接口
日志最终输出的末端接口。可以在里面增加输出到终端、输出到文件、输出到Flash等方法。
```C
void elog_port_output(const char *log, size_t size)
```
|参数 |描述|
|:----- |:----|
|log |日志内容|
|size |日志大小|
例子:
```c
void elog_port_output(const char *log, size_t size) {
/* output to terminal */
printf("%.*s", size, log);
/* output to flash */
elog_flash_write(log, size);
}
```
### 3.3 对日志输出加锁
对日志输出方法进行加锁,保证日志在并发输出时的正确性。有操作系统时可以使用获取信号量来加锁,裸机时可以通过关闭全局中断来加锁。
```C
void elog_port_output_lock(void)
```
### 3.4 对日志输出解锁
与日志输出加锁功能对应。
```C
void elog_port_output_unlock(void)
```
### 3.5 获取当前时间
返回当前时间,将会显示在日志中。
```C
const char *elog_port_get_time(void)
```
### 3.6 获取进程信息
返回进程信息,将会显示在日志中。(没有则可以返回 `""`
```C
const char *elog_port_get_p_info(void)
```
### 3.7 获取线程信息
返回线程信息,将会显示在日志中。(没有则可以返回 `""`
```C
const char *elog_port_get_t_info(void)
```
## 4、设置参数
配置时需要修改项目中的`elog_cfg.h`文件,开启、关闭、修改对应的宏即可。
### 4.1 输出开关
开启后,日志才会被输出。如果关闭,所有日志输出代码都将会被替换为空。
- 操作方法:开启、关闭`ELOG_OUTPUT_ENABLE`宏即可
### 4.2 输出级别
此方法为静态设置输出级别。设置后,比当前输出级别低的日志输出代码将会被替换为空。
输出控制级别: `ELOG_OUTPUT_ENABLE总开关 > ELOG_OUTPUT_LVL静态 > elog_set_filter动态`
- 操作方法:修改`ELOG_OUTPUT_LVL`宏对应值即可
可选的设置级别如下:
```
/* output log's level */
#define ELOG_LVL_ASSERT 0
#define ELOG_LVL_ERROR 1
#define ELOG_LVL_WARN 2
#define ELOG_LVL_INFO 3
#define ELOG_LVL_DEBUG 4
#define ELOG_LVL_VERBOSE 5
```
### 4.3 断言开关
开启后,将会启动断言检查功能。如果关闭,所有断言检查代码都将会被替换为空。
- 操作方法:开启、关闭`ELOG_ASSERT_ENABLE`宏即可
### 4.4 每行日志的缓冲区大小
该配置决定了日志一行最多输出多少字符单位byte。
- 操作方法:修改`ELOG_LINE_BUF_SIZE`宏对应值即可
### 4.5 行号最大长度
建议设置`5`较为合适,用户可以根据自己的文件行号最大值进行设置,例如最大行号为:`9999`,则可以设置行号最大长度为`4`
- 操作方法:修改`ELOG_LINE_NUM_MAX_LEN`宏对应值即可
### 4.6 过滤标签最大长度
日志中标签内容及用户设置过滤标签的最大长度单位byte。
- 操作方法:修改`ELOG_FILTER_TAG_MAX_LEN`宏对应值即可
### 4.7 过滤关键词最大长度
用户可设置过滤关键字的最大长度单位byte。
- 操作方法:修改`ELOG_FILTER_KW_MAX_LEN`宏对应值即可
### 4.8 标签 + 级别过滤器的最大数目
最大支持的动态日志级别过滤的模块(标签)数量,详见 `elog_set_filter_tag_lvl`
- 操作方法:修改`ELOG_FILTER_TAG_LVL_MAX_NUM`宏对应值即可
### 4.9 换行符
用户可以根据自己的使用场景自定义换行符,例如:`"\r\n"``"\n"`
- 操作方法:修改`ELOG_NEWLINE_SIGN`宏对应值即可
### 4.10 颜色
> **注意** :启用颜色功能需先定义 `ELOG_COLOR_ENABLE`
每个级别的日志均有默认颜色。如果想修改,请先查看在 `elog.c` 的头部定义的各种颜色及字体风格,这里以修改 `VERBOSE` 级别日志来举例:
首先选择前景色为白色,再选择背景色为黑色,最后字体风格为粗体
那么最终的配置如下:
```
#define ELOG_COLOR_VERBOSE (F_WHITE B_BLACK S_BOLD)
```
- 操作方法:增加并修改`ELOG_COLOR_VERBOSE`宏对应值即可,其他级别日志颜色的修改以此类推
### 4.11 异步输出模式
开启异步输出模式后,将会提升用户应用程序的执行效率。应用程序在进行日志输出时,无需等待日志彻底输出完成,即可直接返回。
- 操作方法:开启、关闭`ELOG_ASYNC_OUTPUT_ENABLE`宏即可
#### 4.11.1 异步输出日志的最高级别
日志低于或等于该级别时,才会通过异步输出。高于该级别的日志都将按照默认的同步方式输出。这样的好处是,提升了较高级别的日志输出的实时性。
- 默认级别:`ELOG_LVL_ASSERT` ,不定义此宏,将会自动按照默认值设置
- 操作方法:修改`ELOG_ASYNC_OUTPUT_LVL`宏对应值即可
#### 4.11.2 异步输出模式缓冲区大小
- 默认大小:`(ELOG_LINE_BUF_SIZE * 10)` ,不定义此宏,将会自动按照默认值设置
- 操作方法:修改`ELOG_ASYNC_OUTPUT_BUF_SIZE`宏对应值即可
#### 4.11.3 异步按行输出日志
由于异步输出方式内部拥有缓冲区,所以直接输出缓冲区中积累的日志时,日志移植输出方法 (`elog_port_output`) 输出的日志将不会按照 **行日志** (以换行符结尾)的格式进行输出。这使得无法在移植输出方法中完成日志的分析处理。开启此功能后,将会最大限度保证移植输出方法每次输出的日志格式都为行日志。
- 操作方法:开启、关闭`ELOG_ASYNC_LINE_OUTPUT`宏即可
#### 4.11.4 启用 pthread 库
异步输出模式默认是使用 POSIX 的 pthread 库来实现,用户的平台如果支持 pthread ,则可以开启此宏。对于一些缺少 pthread 的支持平台,可以关闭此宏,参考 `elog_async.c` 中关于日志异步输出线程的实现方式,自己动手实现此功能。
- 操作方法:开启、关闭`ELOG_ASYNC_OUTPUT_USING_PTHREAD`宏即可
### 4.12 缓冲输出模式
开启缓冲输出模式后,如果缓冲区不满,用户线程在进行日志输出时,无需等待日志彻底输出完成,即可直接返回。但当日志缓冲区满以后,将会占用用户线程,自动将缓冲区中的日志全部输出干净。同时用户也可以在非日志输出线程,通过定时等机制使用 `void elog_flush(void)` 将缓冲区中的日志输出干净。
- 操作方法:开启、关闭`ELOG_BUFF_OUTPUT_ENABLE`宏即可
#### 4.12.1 缓冲输出模式缓冲区大小
- 默认大小:`(ELOG_LINE_BUF_SIZE * 10)` ,不定义此宏,将会自动按照默认值设置
- 操作方法:修改`ELOG_BUF_OUTPUT_BUF_SIZE`宏对应值即可
## 5、测试验证
如果`\demo\`文件夹下有与项目平台一致的Demo则直接编译运行观察测试结果即可。无需关注下面的步骤。
每次使用前,务必先执行`elog_init()`方法对EasyLogger库进行初始化保证初始化没问题后再设置输出格式、过滤级别、断言钩子等最后记得调用`elog_start()`方法启动EasyLogger否则EasyLogger将不会开始工作。启动后接上终端就即可日志的输出信息可以参考并运行这里的[日志测试函数](https://github.com/armink/EasyLogger/blob/master/demo/os/windows/main.c#L76-L88)。如果出现错误或断言,需根据提示信息检查移植配置及接口。
下面为常见初始化方式([点击查看源码](https://github.com/armink/EasyLogger/blob/master/demo/os/windows/main.c)
```c
/* close printf buffer */
setbuf(stdout, NULL);
/* initialize EasyLogger */
elog_init();
/* set EasyLogger log format */
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_TIME);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~ELOG_FMT_FUNC);
/* start EasyLogger */
elog_start();
```

@ -1,4 +0,0 @@
|文件名 |描述|
|:----- |:----|
|flash.md |flash插件移植文档|
|kernel.md |核心功能移植文档|

@ -1,4 +0,0 @@
|文件名 |描述|
|:----- |:----|
|api |API说明|
|port |移植说明|
Loading…
Cancel
Save