# 日志 **Repository Path**: backsoon0/log ## Basic Information - **Project Name**: 日志 - **Description**: 适用于stm32的日志 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-03-08 - **Last Updated**: 2026-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: log, 日志, stm32 ## README # Log日志 此代码可以将串口的日志信息清晰的输出出来,包括文件名,函数名,时间。 ## 快速使用 1. 通过`log_set_all_fmt()`和`log_set_fmt()`函数配置日志输出内容,`log_set_fmt()`中的参数可以使用`|`或起来,如:LOG_FMT_LEVEL|LOG_FMT_TIME;一开始默认所有额外信息都不输出,只会输出你要输出的内容。 2. 日志默认开启,可以通过`log_disable()`和`log_enable()`来进行关闭和开启。 3. 需要在`log_port.c`文件中配置输出接口。 `log_port.c`的示例如下: ```c USART_SendType channel_0; USART_SendType channel_1; // 日志接口初始化 void log_port_init(void) { // 最好直接在这里设置日志输出通道,这里要输入的是你的接口句柄 // 这里将通道0的句柄设置为channel_0 log_set_channel(0, (void *)&channel_0); log_set_channel(1, (void *)&channel_1); // 对句柄进行初始化 USART_SendInit(&channel_0, (void *)(&huart1)); USART_SendInit(&channel_1, (void *)(&huart2)); } // 这个this参数是log_set_channel()设置的通道句柄,在这个例子当中,this的值可能是channel_0或channel_1 uint8_t log_port_output(void *this, uint8_t *data, uint16_t size) { return USART_SendData((USART_SendType*)this, data, size, USART_USE_MOLLOC); } ``` 4. 如需要使用`usart_send`功能则需要要在`usart_send_port.c`中进行配置发送功能,如: ```c // 配置普通发送接口 uint8_t log_port_output(void *this, uint8_t *data, uint16_t size) { return USART_SendData((USART_SendType*)this, data, size, USART_USE_MOLLOC); } // 配置中断发送接口 uint8_t log_port_output_IT(void *this, uint8_t *data, uint16_t size) { return USART_SendData((USART_SendType*)this, data, size, USART_USE_RING_BUFF); } ``` 5. 关于`log.h`和`usart_send.h`中的配置项可以在[相关配置](#相关配置)中进行查看 7. 关于各个函数的作用请在[函数引用](#函数引用)中自行查看 6. 更多配置请在.c和.h中自行探索 ### 使用实例 ```c // test.c void send_init() { log_set_all_fmt(); log_init(); } void fun() { // 这里选中的是通道0 log_choose_channel(0); // 这个例子输出就是 [INFO][123]test.c|fun():55:this is the channel 0 // 依次为输出等级、时间、文件名、函数名、行号、内容 LOG_INFO("this is the channel 0"); log_choose_channel(1); LOG_INFO("this is the channel 1"); // ...more } ``` ## 相关配置 ### log配置 | 设置项 | 类型 | 默认值 | 配置说明 | | ----- | ----- | ------ | ------- | | LOG_CHANNEL_NUM | uint8_t | 4(个通道) | 可以设置的最大通道数量 | | LOG_BUFFER_SIZE | uint16_t | 256(个字节) | 一次性最大输出长度 | | ENABLE_LOG | 1/0 | 1(开启) | 是否开启日志 | | LOG_LEVEL | (LOG_LEVEL) | LOG_LEVEL_DEBUG(打印所有日志) | 开启的日志级别 | | USE_BASE_LINE | 1/0 | 1(开启) | 路径是否只输出文件名 | | USING_FUNCTION | 1/0 | 1(开启) | 是否使用函数名 | | USING_FILE | 1/0 | 1(开启) | 是否使用文件名 | ### usart_send配置 | 设置项 | 类型 | 默认值 | 配置说明 | | ----- | ----- | ------ | ------- | | USART_QUEUE_MAX_SIZE | uint8_t | 30(个) | 待发送队列最大长度 | USART_BUFF_SIZE | uint16_t | 1024(个字节) | 发送缓冲区最大长度(普通发送+中断发送) | USART_RING_BUFF_SIZE | uint16_t | 1024(个字节) | 环形缓冲区大小 ## 函数引用 ### log_init ```c void log_init(void); ``` 初始化log,请在输出串口前进行调用。 ### log_set_all_fmt ```c void log_set_all_fmt(void); ``` 设置日志输出所有格式,可以在调用`log_init()`前进行调用。 ### log_set_fmt ```c void log_set_fmt(uint8_t level, uint16_t type); ``` 设置日志输出格式。 参数: - `level`:需要设置的等级 - `type`:要设置的类型,在枚举变量`LogFmtType`中进行选择 如: ```c // 显示INFO中的日志级别和时间 log_set_fmt(LOG_LEVEL_INFO,LOG_FMT_LEVEL|LOG_FMT_TIME); ``` ### log_clear_fmt ```c void log_clear_fmt(uint8_t level, uint16_t type); ``` 清除日志输出格式。 参数: - `level`:需要设置的等级 - `type`:要设置的类型,在枚举变量`LogFmtType`中进行选择 如: ```c // 清除(不显示)INFO中的日志级别和时间 log_clear_fmt(LOG_LEVEL_INFO,LOG_FMT_LEVEL|LOG_FMT_TIME); ``` ### log_set_channel ```c void log_set_channel(uint8_t channel, void* data); ``` 设置通道。 参数: - `channel`:需要设置的通道 - `data`:该通道所保存的句柄 例子可以在[快速使用](#快速使用)中查看 ### log_choose_channel ```c void log_choose_channel(uint8_t channel); ``` 要进行打印输出的通道 参数: - `channel`:要选择的输出通道 例子可以在[使用实例](#使用实例)中进行查看 ### log_disable 和 log_enable ```c void log_disable(void); void log_enable(void); ``` 开启和关闭日志,即是否开启日志输出。