1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "base/log/log_wrapper.h"
17 
18 #ifdef _GNU_SOURCE
19 #include <dlfcn.h>
20 #endif
21 #include <mutex>
22 #include <cstring>
23 #include <unordered_map>
24 
25 #include "hilog/log.h"
26 
27 #ifdef ACE_INSTANCE_LOG
28 #include "core/common/container_scope.h"
29 #endif
30 
31 namespace OHOS::Ace {
32 namespace {
33 #ifdef ACE_INSTANCE_LOG
34 constexpr const char* INSTANCE_ID_GEN_REASONS[] = {
35     "scope",
36     "active",
37     "default",
38     "singleton",
39     "foreground",
40     "undefined",
41 };
42 #endif
43 } // namespace
44 
45 const std::unordered_map<AceLogTag, const char*> g_DOMAIN_CONTENTS_MAP = {
46     { AceLogTag::ACE_DEFAULT_DOMAIN, "Ace" },
47     { AceLogTag::ACE_ALPHABET_INDEXER, "AceAlphabetIndexer" },
48     { AceLogTag::ACE_COUNTER, "AceCounter" },
49     { AceLogTag::ACE_SUB_WINDOW, "AceSubWindow" },
50     { AceLogTag::ACE_FORM, "AceForm" },
51     { AceLogTag::ACE_DRAG, "AceDrag" },
52     { AceLogTag::ACE_VIDEO, "AceVideo" },
53     { AceLogTag::ACE_COMPONENT_SNAPSHOT, "AceComponentSnapshot" },
54     { AceLogTag::ACE_CANVAS, "AceCanvas" },
55     { AceLogTag::ACE_REFRESH, "AceRefresh" },
56     { AceLogTag::ACE_SCROLL, "AceScroll" },
57     { AceLogTag::ACE_SCROLLABLE, "AceScrollable" },
58     { AceLogTag::ACE_FONT, "AceFont" },
59     { AceLogTag::ACE_OVERLAY, "AceOverlay" },
60     { AceLogTag::ACE_DIALOG_TIMEPICKER, "AceDialogTimePicker" },
61     { AceLogTag::ACE_DIALOG, "AceDialog" },
62     { AceLogTag::ACE_PANEL, "AcePanel" },
63     { AceLogTag::ACE_MENU, "AceMenu" },
64     { AceLogTag::ACE_TEXTINPUT, "AceTextInput" },
65     { AceLogTag::ACE_TEXT, "AceText" },
66     { AceLogTag::ACE_TEXT_FIELD, "AceTextField" },
67     { AceLogTag::ACE_SWIPER, "AceSwiper" },
68     { AceLogTag::ACE_TABS, "AceTabs" },
69     { AceLogTag::ACE_BLANK, "AceBlank" },
70     { AceLogTag::ACE_GRIDROW, "AceGridRow" },
71     { AceLogTag::ACE_INPUTTRACKING, "AceInputTracking" },
72     { AceLogTag::ACE_RICH_TEXT, "AceRichText" },
73     { AceLogTag::ACE_WEB, "AceWeb" },
74     { AceLogTag::ACE_FOCUS, "AceFocus" },
75     { AceLogTag::ACE_MOUSE, "AceMouse" },
76     { AceLogTag::ACE_GESTURE, "AceGesture" },
77     { AceLogTag::ACE_IMAGE, "AceImage" },
78     { AceLogTag::ACE_RATING, "AceRating" },
79     { AceLogTag::ACE_LIST, "AceList" },
80     { AceLogTag::ACE_NAVIGATION, "AceNavigation" },
81     { AceLogTag::ACE_WATERFLOW, "AceWaterFlow" },
82     { AceLogTag::ACE_ACCESSIBILITY, "AceAccessibility" },
83     { AceLogTag::ACE_ROUTER, "AceRouter" },
84     { AceLogTag::ACE_THEME, "AceTheme" },
85     { AceLogTag::ACE_BORDER_IMAGE, "AceBorderImage" },
86     { AceLogTag::ACE_GRID, "AceGrid" },
87     { AceLogTag::ACE_PLUGIN_COMPONENT, "AcePluginComponent" },
88     { AceLogTag::ACE_UIEXTENSIONCOMPONENT, "AceUiExtensionComponent" },
89     { AceLogTag::ACE_IF, "AceIf" },
90     { AceLogTag::ACE_FOREACH, "AceForEach" },
91     { AceLogTag::ACE_LAZY_FOREACH, "AceLazyForEach" },
92     { AceLogTag::ACE_GAUGE, "AceGauge" },
93     { AceLogTag::ACE_HYPERLINK, "AceHyperLink" },
94     { AceLogTag::ACE_ANIMATION, "AceAnimation" },
95     { AceLogTag::ACE_XCOMPONENT, "AceXcomponent" },
96     { AceLogTag::ACE_AUTO_FILL, "AceAutoFill" },
97     { AceLogTag::ACE_KEYBOARD, "AceKeyboard" },
98     { AceLogTag::ACE_UIEVENT, "AceUIEvent" },
99     { AceLogTag::ACE_UI_SERVICE, "AceUIService" },
100     { AceLogTag::ACE_DISPLAY_SYNC, "AceDisplaySync" },
101     { AceLogTag::ACE_RESOURCE, "AceResource" },
102     { AceLogTag::ACE_SIDEBAR, "AceSideBarContainer" },
103     { AceLogTag::ACE_GEOMETRY_TRANSITION, "AceGeometryTransition" },
104     { AceLogTag::ACE_DOWNLOAD_MANAGER, "DownloadManager" },
105     { AceLogTag::ACE_WINDOW_SCENE, "AceWindowScene" },
106     { AceLogTag::ACE_NODE_CONTAINER, "AceNodeContainer" },
107     { AceLogTag::ACE_NATIVE_NODE, "AceNativeNode" },
108     { AceLogTag::ACE_ISOLATED_COMPONENT, "AceIsolatedComponent" },
109     { AceLogTag::ACE_SECURITYUIEXTENSION, "AceSecurityUiExtensionComponent" },
110     { AceLogTag::ACE_MARQUEE, "AceMarquee" },
111     { AceLogTag::ACE_OBSERVER, "AceObserver" },
112     { AceLogTag::ACE_EMBEDDED_COMPONENT, "AceEmbeddedComponent" },
113     { AceLogTag::ACE_TEXT_CLOCK, "AceTextClock" },
114     { AceLogTag::ACE_FOLDER_STACK, "AceFolderStack" },
115     { AceLogTag::ACE_SELECT_COMPONENT, "AceSelectComponent" },
116     { AceLogTag::ACE_STATE_STYLE, "AceStateStyle" },
117     { AceLogTag::ACE_SEARCH, "AceSearch" },
118     { AceLogTag::ACE_STATE_MGMT, "AceStateMgmt" },
119     { AceLogTag::ACE_REPEAT, "AceRepeat" },
120     { AceLogTag::ACE_SHEET, "AceSheet" },
121     { AceLogTag::ACE_CANVAS_COMPONENT, "AceCanvasComponent" },
122     { AceLogTag::ACE_SCROLL_BAR, "AceScrollBar" },
123     { AceLogTag::ACE_MOVING_PHOTO, "AceMovingPhoto" },
124     { AceLogTag::ACE_ARK_COMPONENT, "AceArkComponent" },
125     { AceLogTag::ACE_WINDOW, "AceWindow" },
126     { AceLogTag::ACE_WINDOW_PIPELINE, "AceWindowPipeline" },
127     { AceLogTag::ACE_INPUTKEYFLOW, "InputKeyFlow"},
128     { AceLogTag::ACE_APPBAR, "AceAppBar"},
129     { AceLogTag::ACE_SELECT_OVERLAY, "AceSelectOverlay"},
130     { AceLogTag::ACE_CLIPBOARD, "AceClipBoard"},
131     { AceLogTag::ACE_SECURITY_COMPONENT, "AceSecurityComponent"},
132     { AceLogTag::ACE_LAYOUT_INSPECTOR, "AceLayoutInspector" },
133     { AceLogTag::ACE_MEDIA_QUERY, "AceMediaQuery" },
134     { AceLogTag::ACE_LAYOUT, "AceLayout" },
135     { AceLogTag::ACE_STYLUS, "AceStylus" },
136 };
137 // initial static member object
138 LogLevel LogWrapper::level_ = LogLevel::DEBUG;
139 
GetSeparatorCharacter()140 char LogWrapper::GetSeparatorCharacter()
141 {
142     return '/';
143 }
144 
145 #ifdef ACE_INSTANCE_LOG
GetId()146 int32_t LogWrapper::GetId()
147 {
148     return ContainerScope::CurrentId();
149 }
150 
GetIdWithReason()151 const std::string LogWrapper::GetIdWithReason()
152 {
153     int32_t currentId = ContainerScope::CurrentId();
154     std::pair<int32_t, InstanceIdGenReason> idWithReason = ContainerScope::CurrentIdWithReason();
155     return std::to_string(currentId) + ":" + std::to_string(idWithReason.first) + ":" +
156            INSTANCE_ID_GEN_REASONS[static_cast<uint32_t>(idWithReason.second)];
157 }
158 #endif
159 
LogBacktrace(size_t maxFrameNums)160 bool LogBacktrace(size_t maxFrameNums)
161 {
162     static const char* (*pfnGetTrace)(size_t, size_t);
163 #ifdef _GNU_SOURCE
164     if (!pfnGetTrace) {
165         pfnGetTrace = (decltype(pfnGetTrace))dlsym(RTLD_DEFAULT, "GetTrace");
166     }
167 #endif
168     if (!pfnGetTrace) {
169         return false;
170     }
171 
172     static std::mutex mtx;
173     std::lock_guard lock(mtx);
174     size_t skipFrameNum = 2;
175     LOGI("Backtrace: skipFrameNum=%{public}zu maxFrameNums=%{public}zu\n%{public}s",
176         skipFrameNum, maxFrameNums, pfnGetTrace(skipFrameNum, maxFrameNums));
177     return true;
178 }
179 } // namespace OHOS::Ace
180