已合并
fix: 导出acllog对外日志接口 #3467
zhangjie创建于 7月7日
fix: 导出acllog对外日志接口 #3467
已合并
共 5 个文件变更+271-2
| @@ -5,6 +5,9 @@ | |||
| 5 | - [使用须知](#使用须知) | 5 | - [使用须知](#使用须知) |
| 6 | - [`void AlogRecord(uint32_t moduleId, uint32_t logType, int32_t level, const char *fmt, ...)`](#AlogRecord):用于记录各模块产生的日志。 | 6 | - [`void AlogRecord(uint32_t moduleId, uint32_t logType, int32_t level, const char *fmt, ...)`](#AlogRecord):用于记录各模块产生的日志。 |
| 7 | - [`int32_t AlogCheckDebugLevel(uint32_t moduleId, int32_t level)`](#AlogCheckDebugLevel):用于校验调测日志级别。 | 7 | - [`int32_t AlogCheckDebugLevel(uint32_t moduleId, int32_t level)`](#AlogCheckDebugLevel):用于校验调测日志级别。 |
| 8 | +- [`void acllogRecord(int32_t moduleId, int32_t level, const char *fmt, ...)`](#acllogRecord):用于记录用户模块产生的日志。 | ||
| 9 | +- [`void acllogVaList(int32_t moduleId, int32_t level, const char *fmt, va_list list)`](#acllogVaList):用于通过va_list记录用户模块产生的日志。 | ||
| 10 | +- [`int32_t acllogCheckDebugLevel(int32_t moduleId, int32_t logLevel)`](#acllogCheckDebugLevel):用于校验用户模块调测日志级别。 | ||
| 8 | - [`int32_t acllogRegisterCallback(acllogRecordCallback callbackFunc, void *userData, uint32_t outputLogType, acllogCallbackHandle *callbackHandle)`](#acllogRegisterCallback):用于注册设备plog日志回调函数。 | 11 | - [`int32_t acllogRegisterCallback(acllogRecordCallback callbackFunc, void *userData, uint32_t outputLogType, acllogCallbackHandle *callbackHandle)`](#acllogRegisterCallback):用于注册设备plog日志回调函数。 |
| 9 | - [`int32_t acllogUnregisterCallback(acllogCallbackHandle callback)`](#acllogUnregisterCallback):用于取消注册设备plog日志回调函数。 | 12 | - [`int32_t acllogUnregisterCallback(acllogCallbackHandle callback)`](#acllogUnregisterCallback):用于取消注册设备plog日志回调函数。 |
| 10 | - [`数据类型定义`](#数据类型定义):日志级别、日志类型和模块ID等数据类型定义。 | 13 | - [`数据类型定义`](#数据类型定义):日志级别、日志类型和模块ID等数据类型定义。 |
| @@ -27,6 +30,8 @@ | |||
| 27 | - 日志回调接口头文件所在路径:${INSTALL_DIR}/include/base/acl_log.h | 30 | - 日志回调接口头文件所在路径:${INSTALL_DIR}/include/base/acl_log.h |
| 28 | - 依赖的库文件路径:${INSTALL_DIR}/lib64/libascendalog.so | 31 | - 依赖的库文件路径:${INSTALL_DIR}/lib64/libascendalog.so |
| 29 | 32 | ||
| 33 | +用户自定义模块可使用`acl_log.h`中的`acllogRecord`、`acllogVaList`和`acllogCheckDebugLevel`接口记录日志。用户moduleId范围为`0xff00`~`0xffff`(65280~65535)。该范围内的moduleId会在日志中按十进制ID记录,不转换为moduleName字符串。CANN内部模块moduleId范围为`0x0000`~`0x00ff`(0~255)。 | ||
| 34 | + | ||
| 30 | ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。以root用户安装为例,安装后文件默认存储路径为:/usr/local/Ascend/cann。 | 35 | ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。以root用户安装为例,安装后文件默认存储路径为:/usr/local/Ascend/cann。 |
| 31 | 36 | ||
| 32 | 37 | ||
| @@ -135,6 +140,138 @@ if(AlogCheckDebugLevel(SLOG, DLOG_INFO) == 1) { | |||
| 135 | <br> | 140 | <br> |
| 136 | 141 | ||
| 137 | 142 | ||
| 143 | +<a id="acllogRecord"></a> | ||
| 144 | + | ||
| 145 | +## acllogRecord | ||
| 146 | + | ||
| 147 | +``` | ||
| 148 | +void acllogRecord(int32_t moduleId, int32_t level, const char *fmt, ...) | ||
| 149 | +``` | ||
| 150 | + | ||
| 151 | +### 产品支持情况 | ||
| 152 | + | ||
| 153 | +| 产品 | 是否支持 | | ||
| 154 | +| --- | :---: | | ||
| 155 | +| Ascend 950PR/Ascend 950DT | √ | | ||
| 156 | +| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ | | ||
| 157 | +| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ | | ||
| 158 | + | ||
| 159 | +### 函数功能 | ||
| 160 | + | ||
| 161 | +用于记录用户模块产生的日志。 | ||
| 162 | + | ||
| 163 | +### 参数说明 | ||
| 164 | + | ||
| 165 | +| 参数 | 输入/输出 | 说明 | | ||
| 166 | +| --- | --- | --- | | ||
| 167 | +| moduleId | 输入 | 用户模块ID,取值范围为`0xff00`~`0xffff`。该范围内的ID在日志中按十进制记录,不转换为moduleName字符串。 | | ||
| 168 | +| level | 输入 | 本条日志级别,宏定义请参见[数据类型定义](#数据类型定义)。 | | ||
| 169 | +| fmt | 输入 | 待打印的内容。接口不校验内容合法性。单条日志最大长度为1024字节,超出则会截断。 | | ||
| 170 | + | ||
| 171 | +### 返回值 | ||
| 172 | + | ||
| 173 | +无。 | ||
| 174 | + | ||
| 175 | +### 调用示例 | ||
| 176 | + | ||
| 177 | +``` | ||
| 178 | +acllogRecord(0xff00, DLOG_INFO, "user module log"); | ||
| 179 | +``` | ||
| 180 | + | ||
| 181 | + | ||
| 182 | +<br> | ||
| 183 | +<br> | ||
| 184 | +<br> | ||
| 185 | + | ||
| 186 | + | ||
| 187 | +<a id="acllogVaList"></a> | ||
| 188 | + | ||
| 189 | +## acllogVaList | ||
| 190 | + | ||
| 191 | +``` | ||
| 192 | +void acllogVaList(int32_t moduleId, int32_t level, const char *fmt, va_list list) | ||
| 193 | +``` | ||
| 194 | + | ||
| 195 | +### 产品支持情况 | ||
| 196 | + | ||
| 197 | +| 产品 | 是否支持 | | ||
| 198 | +| --- | :---: | | ||
| 199 | +| Ascend 950PR/Ascend 950DT | √ | | ||
| 200 | +| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ | | ||
| 201 | +| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ | | ||
| 202 | + | ||
| 203 | +### 函数功能 | ||
| 204 | + | ||
| 205 | +用于通过`va_list`记录用户模块产生的日志。 | ||
| 206 | + | ||
| 207 | +### 参数说明 | ||
| 208 | + | ||
| 209 | +| 参数 | 输入/输出 | 说明 | | ||
| 210 | +| --- | --- | --- | | ||
| 211 | +| moduleId | 输入 | 用户模块ID,取值范围为`0xff00`~`0xffff`。该范围内的ID在日志中按十进制记录,不转换为moduleName字符串。 | | ||
| 212 | +| level | 输入 | 本条日志级别,宏定义请参见[数据类型定义](#数据类型定义)。 | | ||
| 213 | +| fmt | 输入 | 待打印的内容。接口不校验内容合法性。单条日志最大长度为1024字节,超出则会截断。 | | ||
| 214 | +| list | 输入 | 可变参数列表。 | | ||
| 215 | + | ||
| 216 | +### 返回值 | ||
| 217 | + | ||
| 218 | +无。 | ||
| 219 | + | ||
| 220 | + | ||
| 221 | +<br> | ||
| 222 | +<br> | ||
| 223 | +<br> | ||
| 224 | + | ||
| 225 | + | ||
| 226 | +<a id="acllogCheckDebugLevel"></a> | ||
| 227 | + | ||
| 228 | +## acllogCheckDebugLevel | ||
| 229 | + | ||
| 230 | +``` | ||
| 231 | +int32_t acllogCheckDebugLevel(int32_t moduleId, int32_t logLevel) | ||
| 232 | +``` | ||
| 233 | + | ||
| 234 | +### 产品支持情况 | ||
| 235 | + | ||
| 236 | +| 产品 | 是否支持 | | ||
| 237 | +| --- | :---: | | ||
| 238 | +| Ascend 950PR/Ascend 950DT | √ | | ||
| 239 | +| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ | | ||
| 240 | +| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ | | ||
| 241 | + | ||
| 242 | +### 函数功能 | ||
| 243 | + | ||
| 244 | +用于校验用户模块调测日志级别。 | ||
| 245 | + | ||
| 246 | +### 参数说明 | ||
| 247 | + | ||
| 248 | +| 参数 | 输入/输出 | 说明 | | ||
| 249 | +| --- | --- | --- | | ||
| 250 | +| moduleId | 输入 | 用户模块ID,取值范围为`0xff00`~`0xffff`。 | | ||
| 251 | +| logLevel | 输入 | 日志级别,宏定义请参见[数据类型定义](#数据类型定义)。 | | ||
| 252 | + | ||
| 253 | +### 返回值 | ||
| 254 | + | ||
| 255 | +返回调测日志级别校验结果。 | ||
| 256 | + | ||
| 257 | +1:级别校验通过 | ||
| 258 | + | ||
| 259 | +0:级别校验不通过 | ||
| 260 | + | ||
| 261 | +### 调用示例 | ||
| 262 | + | ||
| 263 | +``` | ||
| 264 | +if (acllogCheckDebugLevel(0xff00, DLOG_INFO) == 1) { | ||
| 265 | + acllogRecord(0xff00, DLOG_INFO, "test debug log"); | ||
| 266 | +} | ||
| 267 | +``` | ||
| 268 | + | ||
| 269 | + | ||
| 270 | +<br> | ||
| 271 | +<br> | ||
| 272 | +<br> | ||
| 273 | + | ||
| 274 | + | ||
| 138 | <a id="acllogRegisterCallback"></a> | 275 | <a id="acllogRegisterCallback"></a> |
| 139 | 276 | ||
| 140 | ## acllogRegisterCallback | 277 | ## acllogRegisterCallback |
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | + | ||
| 14 | 15 | ||
| 15 | 16 | ||
| 16 | 17 | ||
| @@ -36,6 +37,14 @@ LOG_FUNC_VISIBILITY int32_t acllogRegisterCallback(acllogRecordCallback callback | |||
| 36 | 37 | ||
| 37 | LOG_FUNC_VISIBILITY int32_t acllogUnregisterCallback(acllogCallbackHandle callback); | 38 | LOG_FUNC_VISIBILITY int32_t acllogUnregisterCallback(acllogCallbackHandle callback); |
| 38 | 39 | ||
| 40 | +LOG_FUNC_VISIBILITY int32_t acllogCheckDebugLevel(int32_t moduleId, int32_t logLevel) __attribute((weak)); | ||
| 41 | + | ||
| 42 | +LOG_FUNC_VISIBILITY void acllogRecord(int32_t moduleId, int32_t level, const char *fmt, ...) | ||
| 43 | + __attribute((weak)) __attribute__((format(printf, 3, 4))); | ||
| 44 | + | ||
| 45 | +LOG_FUNC_VISIBILITY void acllogVaList(int32_t moduleId, int32_t level, const char *fmt, va_list list) | ||
| 46 | + __attribute((weak)); | ||
| 47 | + | ||
| 39 | 48 | ||
| 40 | } | 49 | } |
| 41 | 50 | ||
| @@ -616,6 +616,71 @@ int32_t CheckLogLevel(int32_t moduleId, int32_t logLevel) | |||
| 616 | } | 616 | } |
| 617 | } | 617 | } |
| 618 | 618 | ||
| 619 | +static const uint32_t ACLLOG_USER_MODULE_ID_MIN = 0xff00U; | ||
| 620 | +static const uint32_t ACLLOG_USER_MODULE_ID_MAX = 0xffffU; | ||
| 621 | + | ||
| 622 | +static bool IsAcllogUserModuleId(int32_t moduleId) | ||
| 623 | +{ | ||
| 624 | + return (moduleId >= static_cast<int32_t>(ACLLOG_USER_MODULE_ID_MIN)) && | ||
| 625 | + (moduleId <= static_cast<int32_t>(ACLLOG_USER_MODULE_ID_MAX)); | ||
| 626 | +} | ||
| 627 | + | ||
| 628 | +static uint32_t GetAcllogModuleId(int32_t moduleId) | ||
| 629 | +{ | ||
| 630 | + return static_cast<uint32_t>(moduleId) & MODULE_ID_MASK; | ||
| 631 | +} | ||
| 632 | + | ||
| 633 | +extern "C" LOG_FUNC_VISIBILITY __attribute((weak)) int32_t acllogCheckDebugLevel(int32_t moduleId, int32_t logLevel) | ||
| 634 | +{ | ||
| 635 | + if (moduleId < 0) { | ||
| 636 | + return FALSE; | ||
| 637 | + } | ||
| 638 | + if (IsAcllogUserModuleId(moduleId)) { | ||
| 639 | + if (logLevel == DLOG_EVENT) { | ||
| 640 | + return GetGlobalEnableEventVar() ? TRUE : FALSE; | ||
| 641 | + } | ||
| 642 | + const int32_t moduleLevel = GetGlobalLogTypeLevelVar(static_cast<uint32_t>(moduleId) & LOG_TYPE_MASK); | ||
| 643 | + if ((logLevel < moduleLevel) || (logLevel >= LOG_MAX_LEVEL)) { | ||
| 644 | + return FALSE; | ||
| 645 | + } | ||
| 646 | + return DlogCheckLogLevel(logLevel); | ||
| 647 | + } | ||
| 648 | + return CheckLogLevel(moduleId, logLevel); | ||
| 649 | +} | ||
| 650 | + | ||
| 651 | +extern "C" LOG_FUNC_VISIBILITY __attribute((weak)) void acllogVaList(int32_t moduleId, int32_t level, const char *fmt, | ||
| 652 | + va_list list) | ||
| 653 | +{ | ||
| 654 | + if (g_slogFuncInfo[DLOG_VA_LIST].handle != nullptr) { | ||
| 655 | + reinterpret_cast<DlogVaListFunc>(g_slogFuncInfo[DLOG_VA_LIST].handle)(moduleId, level, fmt, list); | ||
| 656 | + return; | ||
| 657 | + } | ||
| 658 | + if ((moduleId < 0) || (fmt == nullptr)) { | ||
| 659 | + return; | ||
| 660 | + } | ||
| 661 | + | ||
| 662 | + LogMsgArg msgArg = { | ||
| 663 | + GetAcllogModuleId(moduleId), | ||
| 664 | + static_cast<uint32_t>(moduleId) & LOG_TYPE_MASK, | ||
| 665 | + level, | ||
| 666 | + 0, | ||
| 667 | + {APPLICATION, 0, 0, 0, {'\0'}}, | ||
| 668 | + {'\0'}, | ||
| 669 | + {nullptr, 0} | ||
| 670 | + }; | ||
| 671 | + | ||
| 672 | + (void)DlogWriteInner(&msgArg, fmt, list); | ||
| 673 | +} | ||
| 674 | + | ||
| 675 | +extern "C" LOG_FUNC_VISIBILITY __attribute((weak)) void acllogRecord(int32_t moduleId, int32_t level, const char *fmt, | ||
| 676 | + ...) | ||
| 677 | +{ | ||
| 678 | + va_list list; | ||
| 679 | + va_start(list, fmt); | ||
| 680 | + acllogVaList(moduleId, level, fmt, list); | ||
| 681 | + va_end(list); | ||
| 682 | +} | ||
| 683 | + | ||
| 619 | void DlogFlush(void) | 684 | void DlogFlush(void) |
| 620 | { | 685 | { |
| 621 | if (g_slogFuncInfo[DLOG_FLUSH].handle != nullptr) { | 686 | if (g_slogFuncInfo[DLOG_FLUSH].handle != nullptr) { |
| @@ -18,6 +18,7 @@ using namespace testing; | |||
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | + | ||
| 21 | 22 | ||
| 22 | 23 | ||
| 23 | 24 | ||
| @@ -242,6 +243,22 @@ TEST_F(EP_ALOG_HOST_EXCP_UTEST, AlogInterfaceError) | |||
| 242 | EXPECT_EQ(0, AlogCheckDebugLevel(0, -1)); | 243 | EXPECT_EQ(0, AlogCheckDebugLevel(0, -1)); |
| 243 | } | 244 | } |
| 244 | 245 | ||
| 246 | +static void CallInvalidAcllogVaList(int32_t moduleId, int32_t level, const char *fmt, ...) | ||
| 247 | +{ | ||
| 248 | + va_list list; | ||
| 249 | + va_start(list, fmt); | ||
| 250 | + acllogVaList(moduleId, level, fmt, list); | ||
| 251 | + va_end(list); | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +TEST_F(EP_ALOG_HOST_EXCP_UTEST, AcllogInterfaceError) | ||
| 255 | +{ | ||
| 256 | + acllogRecord(0xff00, DLOG_INFO, nullptr); | ||
| 257 | + CallInvalidAcllogVaList(0xff00, DLOG_INFO, nullptr, 1); | ||
| 258 | + EXPECT_EQ(0, acllogCheckDebugLevel(0xff00, DLOG_NULL + 1)); | ||
| 259 | + EXPECT_EQ(0, acllogCheckDebugLevel(-1, DLOG_INFO)); | ||
| 260 | +} | ||
| 261 | + | ||
| 245 | TEST_F(EP_ALOG_HOST_EXCP_UTEST, DlogInvalidModuleId) | 262 | TEST_F(EP_ALOG_HOST_EXCP_UTEST, DlogInvalidModuleId) |
| 246 | { | 263 | { |
| 247 | // 初始化 | 264 | // 初始化 |
| @@ -341,4 +358,4 @@ TEST_F(EP_ALOG_HOST_EXCP_UTEST, PlogMkdirNoPemission) | |||
| 341 | DlogDestructor(); | 358 | DlogDestructor(); |
| 342 | unsetenv("ASCEND_PROCESS_LOG_PATH"); | 359 | unsetenv("ASCEND_PROCESS_LOG_PATH"); |
| 343 | EXPECT_EQ(1, GetErrLogNum()); | 360 | EXPECT_EQ(1, GetErrLogNum()); |
| 344 | -} | 361 | +} |
| @@ -15,6 +15,7 @@ using namespace testing; | |||
| 15 | 15 | ||
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | + | ||
| 18 | 19 | ||
| 19 | 20 | ||
| 20 | 21 | ||
| @@ -951,6 +952,46 @@ TEST_F(EP_ALOG_HOST_FUNC_UTEST, AlogCheckDebugLogLevelInterface) | |||
| 951 | unsetenv("ASCEND_PROCESS_LOG_PATH"); | 952 | unsetenv("ASCEND_PROCESS_LOG_PATH"); |
| 952 | } | 953 | } |
| 953 | 954 | ||
| 955 | +static void CallAcllogVaList(int32_t moduleId, int32_t level, const char *fmt, ...) | ||
| 956 | +{ | ||
| 957 | + va_list list; | ||
| 958 | + va_start(list, fmt); | ||
| 959 | + acllogVaList(moduleId, level, fmt, list); | ||
| 960 | + va_end(list); | ||
| 961 | +} | ||
| 962 | + | ||
| 963 | +TEST_F(EP_ALOG_HOST_FUNC_UTEST, AcllogCheckDebugLogLevelInterface) | ||
| 964 | +{ | ||
| 965 | + setenv("ASCEND_GLOBAL_LOG_LEVEL", "1", 1); | ||
| 966 | + setenv("ASCEND_PROCESS_LOG_PATH", PATH_ROOT, 1); | ||
| 967 | + DlogConstructor(); | ||
| 968 | + | ||
| 969 | + EXPECT_EQ(0, acllogCheckDebugLevel(0xff00, DLOG_DEBUG)); | ||
| 970 | + EXPECT_EQ(1, acllogCheckDebugLevel(0xff00, DLOG_INFO)); | ||
| 971 | + EXPECT_EQ(1, acllogCheckDebugLevel(0xffff, DLOG_WARN)); | ||
| 972 | + EXPECT_EQ(1, acllogCheckDebugLevel(0xffff, DLOG_ERROR)); | ||
| 973 | + EXPECT_EQ(0, acllogCheckDebugLevel(0xff00, DLOG_NULL + 1)); | ||
| 974 | + | ||
| 975 | + DlogDestructor(); | ||
| 976 | + unsetenv("ASCEND_GLOBAL_LOG_LEVEL"); | ||
| 977 | + unsetenv("ASCEND_PROCESS_LOG_PATH"); | ||
| 978 | +} | ||
| 979 | + | ||
| 980 | +TEST_F(EP_ALOG_HOST_FUNC_UTEST, AcllogPrintUserModuleId) | ||
| 981 | +{ | ||
| 982 | + setenv("ASCEND_GLOBAL_LOG_LEVEL", "0", 1); | ||
| 983 | + setenv("ASCEND_PROCESS_LOG_PATH", PATH_ROOT, 1); | ||
| 984 | + DlogConstructor(); | ||
| 985 | + | ||
| 986 | + acllogRecord(0xff00, DLOG_INFO, "user module log %d", 1); | ||
| 987 | + CallAcllogVaList(0xffff, DLOG_WARN, "user va log %d", 2); | ||
| 988 | + | ||
| 989 | + DlogDestructor(); | ||
| 990 | + EXPECT_EQ(2, DlogCheckHostPrintNum(PATH_ROOT, "debug")); | ||
| 991 | + unsetenv("ASCEND_GLOBAL_LOG_LEVEL"); | ||
| 992 | + unsetenv("ASCEND_PROCESS_LOG_PATH"); | ||
| 993 | +} | ||
| 994 | + | ||
| 954 | TEST_F(EP_ALOG_HOST_FUNC_UTEST, DlogAllInterface) | 995 | TEST_F(EP_ALOG_HOST_FUNC_UTEST, DlogAllInterface) |
| 955 | { | 996 | { |
| 956 | // 初始化 | 997 | // 初始化 |
| @@ -1061,4 +1102,4 @@ TEST_F(EP_ALOG_HOST_FUNC_UTEST, DlogPrint_HostLogWithUnifiedSwitch) | |||
| 1061 | unsetenv("ASCEND_GLOBAL_LOG_LEVEL"); | 1102 | unsetenv("ASCEND_GLOBAL_LOG_LEVEL"); |
| 1062 | unsetenv("ASCEND_PROCESS_LOG_PATH"); | 1103 | unsetenv("ASCEND_PROCESS_LOG_PATH"); |
| 1063 | SetUnifiedSwitch(false); | 1104 | SetUnifiedSwitch(false); |
| 1064 | -} | 1105 | +} |