日志管理
概述
在一个系统中日志管理是一个很重要的部分,因为当系统发布到线上后出了问题只能看系统日志了,这个时候系统日志起到了一个错误排查功能。
YOC平台提供了一个带错误等级、模块名称及时间标签的标准日志信息输出。当前,终端用户也可根据自身需要加以扩展或另外实现。
在使用时,仅需包含如下头文件即可。
#include <aos/log.h>
日志级别
log.h头文件中主要定义了5种日志级别,分别如下:
typedef enum {
AOS_LL_NONE = LOG_EMERG, /* disable log */
AOS_LL_FATAL = LOG_CRIT, /* fatal log will output */
AOS_LL_ERROR = LOG_ERR, /* fatal + error log will output */
AOS_LL_WARN = LOG_WARNING, /* fatal + warn + error log will output(default level) */
AOS_LL_INFO = LOG_INFO, /* info + warn + error log will output */
AOS_LL_DEBUG = LOG_DEBUG, /* debug + info + warn + error + fatal log will output */
} aos_log_level_t;
AOS_LL_NONE | 不输出任何信息 |
---|---|
AOS_LL_FATAL | 致命错误输出 |
AOS_LL_ERROR | 错误输出 |
AOS_LL_WARN | 警告输出 |
AOS_LL_INFO | 信息输出 |
AOS_LL_DEBUG | 调试信息输出 |
从AOS_LL_NONE到AOS_LL_DEBUG等级值增大,指定等级后,输出小于等于该等级的日志信息。
接口定义
同步日志
int ulog(const unsigned char s, const char *mod, const char *f,
const unsigned long l, const char *fmt, ...);
- 参数
- s:日志有效性
- mod:模块名称
- f:文件名
- l:注释行号
- fmt:可变参数
- 返回值
- 0:成功
- <0:失败
日志等级设置
运行时日志输出等级控制。
int aos_set_log_level(aos_log_level_t log_level);
参数
- log_level:日志等级
返回值
- 0:成功
- 非0:失败
日志等级获取
运行时日志获取等级控制。
aos_log_level_t aos_get_log_level();
- 参数
- 无
- 返回值
- 返回日志等级
日志初始化
void ulog_init(void);
- 参数
- 无
- 返回值
- 无
管理ulog
int ulog_man(const char *cmd_str);
- 参数
- 无
- 返回值
- 0:成功
- -EINVAL:无效参数
- -EPERM:ulog模块未初始化
- -EACCES:函数不工作
刷新ulog缓冲区
void ulog_flush();
- 参数
- 无
- 返回值
- 无
获取ulog列表
int aos_get_ulog_list(char *buf, const unsigned short len);
- 参数
- buf:缓冲区接收的文件列表
- len:缓冲区长度
- 返回值
- 0:成功
- -EINVAL:无效参数
- -ENOMEN:内存不足
- -EIO:系统错误
日志转存到缓冲区
int aos_log_hexdump(const char* tag, char *buffer, int len);
- 参数
- tag:模块名称
- buffer:缓冲区指针
- len:指针长度
- 返回值
- 0:成功
- 非0:失败
使用示例
示例代码如下:
#define TAG "player" // 在具体模块文件中定义模块名
/**
* @brief new a player obj
* @param [in] event_cb : callback of the player event
* @return NULL on err
*/
player_t* player_new(player_event_t event_cb)
{
player_t *player = NULL;
LOGD(TAG, "%s, %d enter.", __FUNCTION__, __LINE__); // 使用LOGD级别打印
player = (struct player_cb*)aos_zalloc(sizeof(struct player_cb));
CHECK_RET_TAG_WITH_RET(player != NULL, NULL);
player->event_cb = event_cb;
player->status = PLAYER_STATUS_STOPED;
player->rcv_timeout = RECV_TIMEOUT_MS_DEFAULT;
aos_event_new(&player->evt, 0);
aos_mutex_new(&player->lock);
_player_once_init(player);
LOGD(TAG, "%s, %d leave. player = %p", __FUNCTION__, __LINE__, player);
return player;
}
打印示意图如下: