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 #ifndef FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_LOG_WRAPPER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_LOG_WRAPPER_H 18 19 #include <cstdarg> 20 #include <cstdint> 21 #include <cstring> 22 #include <string> 23 #include <unordered_map> 24 25 #include "base/utils/macros.h" 26 #include "base/utils/system_properties.h" 27 28 #ifdef ACE_INSTANCE_LOG 29 #define ACE_FMT_PREFIX "[%{public}s(%{public}d)-(%{public}s)] " 30 #define ACE_LOG_ID_WITH_REASON , OHOS::Ace::LogWrapper::GetIdWithReason().c_str() 31 #else 32 #define ACE_FMT_PREFIX "[%{private}s(%{private}d)] " 33 #define ACE_LOG_ID_WITH_REASON 34 #endif 35 36 #if defined(USE_HILOG) 37 #include "hilog/log.h" 38 constexpr uint32_t ACE_DOMAIN = 0xD003900; 39 constexpr uint32_t APP_DOMAIN = 0xC0D0; 40 #ifdef IS_RELEASE_VERSION 41 #define PRINT_LOG(level, tag, fmt, ...) \ 42 HILOG_IMPL(LOG_CORE, LOG_##level, (tag + ACE_DOMAIN), (OHOS::Ace::g_DOMAIN_CONTENTS_MAP.at(tag)), \ 43 "[(%{public}s)] " fmt, OHOS::Ace::LogWrapper::GetIdWithReason().c_str(), ##__VA_ARGS__) 44 #else 45 #define PRINT_LOG(level, tag, fmt, ...) \ 46 HILOG_IMPL(LOG_CORE, LOG_##level, (tag + ACE_DOMAIN), (OHOS::Ace::g_DOMAIN_CONTENTS_MAP.at(tag)), \ 47 ACE_FMT_PREFIX fmt, OHOS::Ace::LogWrapper::GetBriefFileName(__FILE__), \ 48 __LINE__ ACE_LOG_ID_WITH_REASON, ##__VA_ARGS__) 49 #endif 50 #define PRINT_APP_LOG(level, fmt, ...) HILOG_IMPL(LOG_APP, LOG_##level, APP_DOMAIN, "JSAPP", fmt, ##__VA_ARGS__) 51 #else 52 #define PRINT_LOG(level, tag, fmt, ...) \ 53 do { \ 54 if (OHOS::Ace::LogWrapper::JudgeLevel(OHOS::Ace::LogLevel::level)) { \ 55 OHOS::Ace::LogWrapper::PrintLog(OHOS::Ace::LogDomain::FRAMEWORK, OHOS::Ace::LogLevel::level, tag, \ 56 ACE_FMT_PREFIX fmt, OHOS::Ace::LogWrapper::GetBriefFileName(__FILE__), \ 57 __LINE__ ACE_LOG_ID_WITH_REASON, ##__VA_ARGS__); \ 58 } \ 59 } while (0) 60 61 #define PRINT_APP_LOG(level, fmt, ...) \ 62 OHOS::Ace::LogWrapper::PrintLog( \ 63 OHOS::Ace::LogDomain::JS_APP, OHOS::Ace::LogLevel::level, OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, \ 64 fmt, ##__VA_ARGS__) 65 #endif 66 67 #define LOGD(fmt, ...) TAG_LOGD(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, fmt, ##__VA_ARGS__) 68 #define LOGI(fmt, ...) TAG_LOGI(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, fmt, ##__VA_ARGS__) 69 #define LOGW(fmt, ...) TAG_LOGW(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, fmt, ##__VA_ARGS__) 70 #define LOGE(fmt, ...) TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, fmt, ##__VA_ARGS__) 71 #define LOGF(fmt, ...) TAG_LOGF(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, fmt, ##__VA_ARGS__) 72 73 #define TAG_LOGD(tag, fmt, ...) PRINT_LOG(DEBUG, tag, fmt, ##__VA_ARGS__) 74 #define TAG_LOGI(tag, fmt, ...) PRINT_LOG(INFO, tag, fmt, ##__VA_ARGS__) 75 #define TAG_LOGW(tag, fmt, ...) PRINT_LOG(WARN, tag, fmt, ##__VA_ARGS__) 76 #define TAG_LOGE(tag, fmt, ...) PRINT_LOG(ERROR, tag, fmt, ##__VA_ARGS__) 77 #define TAG_LOGF(tag, fmt, ...) PRINT_LOG(FATAL, tag, fmt, ##__VA_ARGS__) 78 79 #define LOG_DESTROY() LOGI("destroyed") 80 #define LOG_FUNCTION() LOGD("function track: %{public}s", __FUNCTION__) 81 82 #define APP_LOGD(fmt, ...) PRINT_APP_LOG(DEBUG, fmt, ##__VA_ARGS__) 83 #define APP_LOGI(fmt, ...) PRINT_APP_LOG(INFO, fmt, ##__VA_ARGS__) 84 #define APP_LOGW(fmt, ...) PRINT_APP_LOG(WARN, fmt, ##__VA_ARGS__) 85 #define APP_LOGE(fmt, ...) PRINT_APP_LOG(ERROR, fmt, ##__VA_ARGS__) 86 #define APP_LOGF(fmt, ...) PRINT_APP_LOG(FATAL, fmt, ##__VA_ARGS__) 87 88 #define JSON_STRING_PUT_INT(jsonValue, var) (jsonValue)->Put(#var, static_cast<int64_t>(var)) 89 #define JSON_STRING_PUT_BOOL(jsonValue, var) (jsonValue)->Put(#var, (var)) 90 #define JSON_STRING_PUT_STRING(jsonValue, var) (jsonValue)->Put(#var, (var).c_str()) 91 #define JSON_STRING_PUT_STRINGABLE(jsonValue, var) (jsonValue)->Put(#var, (var).ToString().c_str()) 92 93 #define JSON_STRING_PUT_OPTIONAL_INT(jsonValue, var) \ 94 do { \ 95 if (var) { \ 96 (jsonValue)->Put(#var, static_cast<int64_t>(*(var))); \ 97 } \ 98 } while (0) \ 99 100 #define JSON_STRING_PUT_OPTIONAL_STRING(jsonValue, var) \ 101 do { \ 102 if (var) { \ 103 (jsonValue)->Put(#var, (var)->c_str()); \ 104 } \ 105 } while (0) \ 106 107 108 #define JSON_STRING_PUT_OPTIONAL_STRINGABLE(jsonValue, var) \ 109 do { \ 110 if (var) { \ 111 (jsonValue)->Put(#var, (var)->ToString().c_str()); \ 112 } \ 113 } while (0) \ 114 115 116 namespace OHOS::Ace { 117 enum AceLogTag : uint8_t { 118 ACE_DEFAULT_DOMAIN = 0, // C03900 119 ACE_ALPHABET_INDEXER, // C03901 120 ACE_COUNTER, // C03902 121 ACE_SUB_WINDOW, // C03903 122 ACE_FORM, // C03904 123 ACE_DRAG, // C03905 124 ACE_VIDEO, // C03906 125 ACE_COMPONENT_SNAPSHOT, // C03907 126 ACE_CANVAS, // C03908 127 ACE_REFRESH, // C03909 128 ACE_SCROLL, // C0390A 129 ACE_SCROLLABLE, // C0390B 130 ACE_FONT, // C0390C 131 ACE_OVERLAY, // C0390D 132 ACE_DIALOG_TIMEPICKER, // C0390E 133 ACE_DIALOG, // C0390F 134 ACE_PANEL, // C03910 135 ACE_MENU, // C03911 136 ACE_TEXTINPUT, // C03912 137 ACE_TEXT, // C03913 138 ACE_TEXT_FIELD, // C03914 139 ACE_SWIPER, // C03915 140 ACE_TABS, // C03916 141 ACE_BLANK, // C03917 142 ACE_GRIDROW, // C03918 143 ACE_INPUTTRACKING, // C03919 144 ACE_RICH_TEXT, // C0391A 145 ACE_WEB, // C0391B 146 ACE_FOCUS, // C0391C 147 ACE_MOUSE, // C0391D 148 ACE_GESTURE, // C0391E 149 ACE_IMAGE, // C0391F 150 ACE_RATING, // C03920 151 ACE_LIST, // C03921 152 ACE_NAVIGATION, // C03922 153 ACE_WATERFLOW, // C03923 154 ACE_ACCESSIBILITY, // C03924 155 ACE_ROUTER, // C03925 156 ACE_THEME, // C03926 157 ACE_BORDER_IMAGE, // C03927 158 ACE_GRID, // C03928 159 ACE_PLUGIN_COMPONENT, // C03929 160 ACE_UIEXTENSIONCOMPONENT, // C0392A 161 ACE_IF, // C0392B 162 ACE_FOREACH, // C0392C 163 ACE_LAZY_FOREACH, // C0392D 164 ACE_GAUGE, // C0392E 165 ACE_HYPERLINK, // C0392F 166 ACE_ANIMATION, // C03930 167 ACE_XCOMPONENT, // C03931 168 ACE_AUTO_FILL, // C03932 169 ACE_KEYBOARD, // C03933 170 ACE_UIEVENT, // C03934 171 ACE_UI_SERVICE, // C03935 ace_engine/adapter/ohos/services/uiservice/src/ui_service_hilog.h 172 ACE_DISPLAY_SYNC, // C03936 173 ACE_RESOURCE, // C03937 174 ACE_SIDEBAR, // C03938 175 ACE_GEOMETRY_TRANSITION, // C03939 176 ACE_DOWNLOAD_MANAGER, // C0393A 177 ACE_WINDOW_SCENE, // C0393B 178 ACE_NODE_CONTAINER, // C0393C 179 ACE_NATIVE_NODE, // C0393D 180 ACE_ISOLATED_COMPONENT, // C0393E 181 ACE_MARQUEE, // C0393F 182 ACE_OBSERVER, // C03940 183 ACE_EMBEDDED_COMPONENT, // C03941 184 ACE_TEXT_CLOCK, // C03942 185 ACE_FOLDER_STACK, // C03943 186 ACE_SELECT_COMPONENT, // C03944 187 ACE_STATE_STYLE, // C03945 188 ACE_SEARCH, // C03946 189 ACE_STATE_MGMT, // C03947 190 ACE_REPEAT, // C03948 191 ACE_SHEET, // C03949 192 ACE_CANVAS_COMPONENT, // C0394A 193 ACE_SCROLL_BAR, // C0394B 194 ACE_MOVING_PHOTO, // C0394C 195 ACE_ARK_COMPONENT, // C0394D 196 ACE_WINDOW, // C0394E 197 ACE_SECURITYUIEXTENSION, // C0394F 198 ACE_WINDOW_PIPELINE, // C03950 199 ACE_INPUTKEYFLOW, // C03951 200 ACE_APPBAR, // C03952 201 ACE_SELECT_OVERLAY, // C03953 202 ACE_CLIPBOARD, // C03954 203 ACE_VISUAL_EFFECT, // C03955 204 ACE_SECURITY_COMPONENT, // C03956 205 ACE_LAYOUT_INSPECTOR, // C03957 206 ACE_MEDIA_QUERY, // C03958 207 ACE_LAYOUT, // C03959 208 209 FORM_RENDER = 255, // C039FF FormRenderer, last domain, do not add 210 }; 211 212 ACE_FORCE_EXPORT extern const std::unordered_map<AceLogTag, const char*> g_DOMAIN_CONTENTS_MAP; 213 214 enum class LogDomain : uint32_t { 215 FRAMEWORK = 0, 216 JS_APP, 217 }; 218 219 enum class LogLevel : uint32_t { 220 DEBUG = 0, 221 INFO, 222 WARN, 223 ERROR, 224 FATAL, 225 }; 226 227 class ACE_FORCE_EXPORT LogWrapper final { 228 public: JudgeLevel(LogLevel level)229 static bool JudgeLevel(LogLevel level) 230 { 231 if (level == LogLevel::DEBUG) { 232 return SystemProperties::GetDebugEnabled(); 233 } 234 return level_ <= level; 235 } 236 SetLogLevel(LogLevel level)237 static void SetLogLevel(LogLevel level) 238 { 239 level_ = level; 240 } 241 GetLogLevel()242 static LogLevel GetLogLevel() 243 { 244 return level_; 245 } 246 GetBriefFileName(const char * name)247 static const char* GetBriefFileName(const char* name) 248 { 249 static const char separator = GetSeparatorCharacter(); 250 const char* p = strrchr(name, separator); 251 return p != nullptr ? p + 1 : name; 252 } 253 StripFormatString(const std::string & prefix,std::string & str)254 static void StripFormatString(const std::string& prefix, std::string& str) 255 { 256 for (auto pos = str.find(prefix, 0); pos != std::string::npos; pos = str.find(prefix, pos)) { 257 str.erase(pos, prefix.size()); 258 } 259 } 260 ReplaceFormatString(const std::string & prefix,const std::string & replace,std::string & str)261 static void ReplaceFormatString(const std::string& prefix, const std::string& replace, std::string& str) 262 { 263 for (auto pos = str.find(prefix, 0); pos != std::string::npos; pos = str.find(prefix, pos)) { 264 str.replace(pos, prefix.size(), replace); 265 } 266 } 267 PrintLog(LogDomain domain,LogLevel level,AceLogTag tag,const char * fmt,...)268 static void PrintLog(LogDomain domain, LogLevel level, AceLogTag tag, const char* fmt, ...) 269 __attribute__((__format__(os_log, 4, 5))) 270 { 271 va_list args; 272 va_start(args, fmt); 273 PrintLog(domain, level, tag, fmt, args); 274 va_end(args); 275 } 276 277 // MUST implement these interface on each platform. 278 static char GetSeparatorCharacter(); 279 static void PrintLog(LogDomain domain, LogLevel level, AceLogTag tag, const char* fmt, va_list args); 280 #ifdef ACE_INSTANCE_LOG 281 static int32_t GetId(); 282 static const std::string GetIdWithReason(); 283 #endif 284 285 private: 286 LogWrapper() = delete; 287 ~LogWrapper() = delete; 288 289 static LogLevel level_; 290 }; 291 292 bool LogBacktrace(size_t maxFrameNums = 256); 293 } // namespace OHOS::Ace 294 295 #endif // FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_LOG_WRAPPER_H 296