日志管理

概述

在一个系统中日志管理是一个很重要的部分,因为当系统发布到线上后出了问题只能看系统日志了,这个时候系统日志起到了一个错误排查功能。

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;
}

打印示意图如下:

results matching ""

    No results matching ""