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