已合并
fix: 导出acllog对外日志接口 #3467
fix: 导出acllog对外日志接口 #3467
已合并
zhangjie创建于 7月7日
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.h30- 日志回调接口头文件所在路径:${INSTALL_DIR}/include/base/acl_log.h
28- 依赖的库文件路径:${INSTALL_DIR}/lib64/libascendalog.so31- 依赖的库文件路径:${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## acllogRegisterCallback277## acllogRegisterCallback
@@ -11,6 +11,7 @@
11#ifndef ACL_LOG_H_11#ifndef ACL_LOG_H_
12#define ACL_LOG_H_12#define ACL_LOG_H_
13 13 
14+#include <stdarg.h>
14#include <stddef.h>15#include <stddef.h>
15#include <stdint.h>16#include <stdint.h>
16#include "log_types.h"17#include "log_types.h"
@@ -36,6 +37,14 @@ LOG_FUNC_VISIBILITY int32_t acllogRegisterCallback(acllogRecordCallback callback
36 37 
37LOG_FUNC_VISIBILITY int32_t acllogUnregisterCallback(acllogCallbackHandle callback);38LOG_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#ifdef __cplusplus48#ifdef __cplusplus
40}49}
41#endif50#endif
@@ -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+ 
619void DlogFlush(void)684void 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#include <cstdlib>18#include <cstdlib>
19#include "slog.h"19#include "slog.h"
20#include "plog.h"20#include "plog.h"
21+#include "acl_log.h"
21#include "alog_pub.h"22#include "alog_pub.h"
22#include "slog_api.h"23#include "slog_api.h"
23#include "plog_drv.h"24#include "plog_drv.h"
@@ -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+ 
245TEST_F(EP_ALOG_HOST_EXCP_UTEST, DlogInvalidModuleId)262TEST_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#include <dlfcn.h>15#include <dlfcn.h>
16#include "slog.h"16#include "slog.h"
17#include "plog.h"17#include "plog.h"
18+#include "acl_log.h"
18#include "alog_pub.h"19#include "alog_pub.h"
19#include "slog_api.h"20#include "slog_api.h"
20#include "plog_drv.h"21#include "plog_drv.h"
@@ -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+ 
954TEST_F(EP_ALOG_HOST_FUNC_UTEST, DlogAllInterface)995TEST_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+}