# 日志
***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.***
---
# 功能概述
本章围绕UniRTOS日志管理模块,系统介绍其功能特性、**API** 使用方法及典型应用示例,旨在帮助开发者快速上手,高效利用日志输出控制功能,提升嵌入式软件的调试与运维效率。
在嵌入式系统开发中,日志是故障定位、性能分析和运行行为追踪不可或缺的手段。UniRTOS日志管理模块从实际工程需求出发,设计为 **轻量、灵活、可配置** 的子系统,它支持编译期和运行期两级日志开关控制,允许开发者根据不同阶段(调试、测试、量产)动态调整日志输出量,避免冗余信息干扰。同时,模块提供了多种输出端口选择(如串口(UART)、调试(SWO/JTAG)、网络(UDP)、甚至LCD显示等),方便将日志定向到最合适的观察通道,并支持日志级别过滤(ERROR / WARN / INFO / DEBUG / TRACE),实现细粒度管控。
本章后续将依次给出核心log宏接口及API的详细说明、配置示例,以及常见应用场景(如多任务调试、异常现场记录、性能统计)的完整代码演示,使您能够快速将日志模块集成到自己的工程中,并灵活定制输出策略。
### log宏函数定义
```c
#define QLOGE(...) QOSA_LOG_E(QOS_LOG_TAG, ##__VA_ARGS__)
#define QLOGW(...) QOSA_LOG_W(QOS_LOG_TAG, ##__VA_ARGS__)
#define QLOGI(...) QOSA_LOG_I(QOS_LOG_TAG, ##__VA_ARGS__)
#define QLOGD(...) QOSA_LOG_D(QOS_LOG_TAG, ##__VA_ARGS__)
#define QLOGV(...) QOSA_LOG_V(QOS_LOG_TAG, ##__VA_ARGS__)
#define QLOGV_EX(...) QOSA_LOG_NO_F(QOS_LOG_TAG, ##__VA_ARGS__)
```
**定义详解:**
| **宏定义** | **日志级别** | **说明** |
| --- | --- | --- |
| *QLOGE(...)* | ERROR | 错误级别日志,用于记录严重错误 |
| *QLOGW(...)* | WARN | 警告级别日志,用于记录潜在问题 |
| *QLOGI(...)* | INFO | 信息级别日志,用于记录重要业务流程 |
| *QLOGD(...)* | DEBUG | 调试级别日志,用于调试信息输出 |
| *QLOGV(...)* | VERBOSE | 详细级别日志,输出最详细的调试信息 |
| *QLOGV_EX(...)* | VERBOSE | 详细级别日志(无函数名信息) |
日志级别优先级:ERROR > WARN > INFO > DEBUG > VERBOSE > NEVER
# 日志API
## 头文件
*qosa_log.h*
## 函数概览
| **函数** | **说明** |
| --- | --- |
| *qosa_log_control_get()* | 获取当前log日志控制掩码 |
| *qosa_log_control_set()* | 设置log日志控制掩码 |
| *qosa_log_printf()* | 格式化log日志输出 |
| *qosa_log_vprintf()* | 可变参数列表格式log日志输出 |
## 函数详解
### 日志控制位掩码定义
```c
/* 日志控制掩码位定义 */
#define QOSA_LOG_BIT_MASTER_ENABLE (1U << 0) /*!< Bit 0: 总开关 */
#define QOSA_LOG_BIT_DEBUG (1U << 1) /*!< Bit 1: DEBUG 串口输出 */
#define QOSA_LOG_BIT_USB (1U << 2) /*!< Bit 2: USB 端口输出 */
#define QOSA_LOG_BIT_SDCARD (1U << 3) /*!< Bit 3: SD 卡输出 */
#define QOSA_LOG_BIT_FLASH (1U << 4) /*!< Bit 4: FLASH 输出 */
```
### qosa_log_control_get
- **功能描述**
获取当前日志控制的掩码值,包含总开关状态和各输出端口使能状态。
- **函数原型**
```c
qosa_uint32_t qosa_log_control_get(void)
```
- **参数说明**
无
- **返回值说明**
当前日志控制掩码(qosa_uint32_t类型)
- 位0:总开关状态(*1*=开启,*0*=关闭)
- 位1:DEBUG端口使能状态
- 位2:USB端口使能状态
### qosa_log_control_set
- **功能描述**
设置日志控制掩码,控制日志总开关及输出端口,配置会自动保存到Flash **。**
- **函数原型**
```c
qosa_log_error_e qosa_log_control_set(qosa_uint32_t mask)
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *mask* | 输入 | *qosa_log_error_e* | 期望设置的日志控制掩码
*QOSA_LOG_BIT_MASTER_ENABLE*:开启总开关
*QOSA_LOG_BIT_DEBUG*:使能DEBUG串口输出
*QOSA_LOG_BIT_USB*:使能USB端口输出 |
- **返回值说明**
*QOSA_LOG_ERRID_SUCCESS*:设置成功
*QOSA_LOG_ERRID_NOT_SUPPORT*:设置了不支持的功能(SD卡或Flash)
### qosa_log_printf
- **功能描述**
格式化输出日志信息,自动添加函数名和行号,通过 *ECPLAT_PRINTF* 输出。
- **函数原型**
```c
void qosa_log_printf(int level, int tag, const char* funcname, int line, const char* fmt, ...)
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *level* | 输入 | int | 日志级别(DEBUG/INFO/WARN/ERROR) |
| *tag* | 输入 | int | 日志标签(通常为 *LOG_TAG* 宏定义) |
| *funcname* | 输入 | const char* | 调用函数的函数名(通常传入_FUNCTION_) |
| *line* | 输入 | int | 调用位置的行号(通常传入_LINE_) |
| *fmt* | 输入 | const char* | 格式化字符串 |
| *...* | ... | ... | 可变参数,根据fmt传入对应参数 |
- **返回值说明**
无
### qosa_log_vprintf
- **功能描述**
获取电池充电状态、剩余电量百分比和电池电压。
- **函数原型**
```c
void qosa_log_vprintf(int level, int tag, const char* funcname, int line, const char* fmt, va_list args)
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *level* | 输入 | int | 日志级别(DEBUG/INFO/WARN/ERROR) |
| *tag* | 输入 | int | 日志标签(通常为 *LOG_TAG* 宏定义) |
| *funcname* | 输入 | const char* | 调用函数的函数名(通常传入_FUNCTION_ ) |
| *line* | 输入 | int | 调用位置的行号(通常传入_LINE_ ) |
| *fmt* | 输入 | const char* | 格式化字符串 |
| *args* | 输入 | va_list | 可变参数列表( va_list类型) |
- **返回值说明**
始终返回 *QOSA_POWER_SUCCESS*:函数执行成功
## 枚举定义
### qosa_log_error_e
结果码枚举定义如下:
```c
typedef enum
{
QOSA_LOG_ERRID_SUCCESS = 0,
QOSA_LOG_ERRID_NOT_SUPPORT = 1 | (QOSA_COMPONENT_LOG << 16),
QOSA_LOG_ERRID_INVALID_PARAM,
} qosa_log_error_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_LOG_ERRID_SUCCESS* | 函数执行成功 |
| *QOSA_LOG_ERRID_NOT_SUPPORT* | 功能不支持 |
| *QOSA_LOG_ERRID_INVALID_PARAM* | 无效参数 |
### qosa_log_level_e
日志级别枚举定义如下:
```c
typedef enum
{
QOSA_LOG_LEVEL_NEVER = 0, /*!< 永不输出(关闭日志) */
QOSA_LOG_LEVEL_ERROR, /*!< 错误级别 */
QOSA_LOG_LEVEL_WARN, /*!< 警告级别 */
QOSA_LOG_LEVEL_INFO, /*!< 信息级别 */
QOSA_LOG_LEVEL_DEBUG, /*!< 调试级别 */
QOSA_LOG_LEVEL_VERBOSE, /*!< 详细级别 */
QOSA_LOG_LEVEL_MAX /*!< 最大级别 */
} qosa_log_level_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_LOG_LEVEL_NEVER* | 永不输出(关闭日志) |
| *QOSA_LOG_LEVEL_NEVER* | 错误级别 |
| *QOSA_LOG_LEVEL_WARN* | 警告级别 |
| *QOSA_LOG_LEVEL_INFO* | 信息级别 |
| *QOSA_LOG_LEVEL_DEBUG* | 调试级别 |
| *QOSA_LOG_LEVEL_VERBOSE* | 详细级别 |
| *QOSA_LOG_LEVEL_MAX* | 最大级别 |
# 应用逻辑流程图
#### 日志输出流程
```{figure} images/board_O2wiwc899hmoSnbLj1VcQ0lUnmd.jpg
:align: center
:alt: image
```
# 示例代码
完整示例代码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/system/log/log.c