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