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