1 /* 2 * Copyright (c) 2021-2022 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 24 #include "base/utils/macros.h" 25 #include "base/utils/system_properties.h" 26 27 #ifdef ACE_INSTANCE_LOG 28 #define ACE_FMT_PREFIX "[%{public}s(%{public}s)-(%{public}s)] " 29 #define ACE_LOG_ID_WITH_REASON , OHOS::Ace::LogWrapper::GetIdWithReason().c_str() 30 #else 31 #define ACE_FMT_PREFIX "[%{private}s(%{private}s)] " 32 #define ACE_LOG_ID_WITH_REASON 33 #endif 34 35 #define PRINT_LOG(level, tag, fmt, ...) \ 36 do { \ 37 if (OHOS::Ace::LogWrapper::JudgeLevel(OHOS::Ace::LogLevel::level)) { \ 38 OHOS::Ace::LogWrapper::PrintLog(OHOS::Ace::LogDomain::FRAMEWORK, OHOS::Ace::LogLevel::level, tag, \ 39 ACE_FMT_PREFIX fmt, OHOS::Ace::LogWrapper::GetBriefFileName(__FILE__), \ 40 __FUNCTION__ ACE_LOG_ID_WITH_REASON, ##__VA_ARGS__); \ 41 } \ 42 } while (0) 43 44 #define LOGD(fmt, ...) TAG_LOGD(OHOS::Ace::AceLogTag::DEFAULT, fmt, ##__VA_ARGS__) 45 #define LOGI(fmt, ...) TAG_LOGI(OHOS::Ace::AceLogTag::DEFAULT, fmt, ##__VA_ARGS__) 46 #define LOGW(fmt, ...) TAG_LOGW(OHOS::Ace::AceLogTag::DEFAULT, fmt, ##__VA_ARGS__) 47 #define LOGE(fmt, ...) TAG_LOGE(OHOS::Ace::AceLogTag::DEFAULT, fmt, ##__VA_ARGS__) 48 #define LOGF(fmt, ...) TAG_LOGF(OHOS::Ace::AceLogTag::DEFAULT, fmt, ##__VA_ARGS__) 49 50 #define TAG_LOGD(tag, fmt, ...) PRINT_LOG(DEBUG, tag, fmt, ##__VA_ARGS__) 51 #define TAG_LOGI(tag, fmt, ...) PRINT_LOG(INFO, tag, fmt, ##__VA_ARGS__) 52 #define TAG_LOGW(tag, fmt, ...) PRINT_LOG(WARN, tag, fmt, ##__VA_ARGS__) 53 #define TAG_LOGE(tag, fmt, ...) PRINT_LOG(ERROR, tag, fmt, ##__VA_ARGS__) 54 #define TAG_LOGF(tag, fmt, ...) PRINT_LOG(FATAL, tag, fmt, ##__VA_ARGS__) 55 56 #define LOG_DESTROY() LOGI("destroyed") 57 #define LOG_FUNCTION() LOGD("function track: %{public}s", __FUNCTION__) 58 59 #define PRINT_APP_LOG(level, fmt, ...) \ 60 OHOS::Ace::LogWrapper::PrintLog( \ 61 OHOS::Ace::LogDomain::JS_APP, OHOS::Ace::LogLevel::level, OHOS::Ace::AceLogTag::DEFAULT, fmt, ##__VA_ARGS__) 62 63 #define APP_LOGD(fmt, ...) PRINT_APP_LOG(DEBUG, fmt, ##__VA_ARGS__) 64 #define APP_LOGI(fmt, ...) PRINT_APP_LOG(INFO, fmt, ##__VA_ARGS__) 65 #define APP_LOGW(fmt, ...) PRINT_APP_LOG(WARN, fmt, ##__VA_ARGS__) 66 #define APP_LOGE(fmt, ...) PRINT_APP_LOG(ERROR, fmt, ##__VA_ARGS__) 67 #define APP_LOGF(fmt, ...) PRINT_APP_LOG(FATAL, fmt, ##__VA_ARGS__) 68 69 namespace OHOS::Ace { 70 71 enum class AceLogTag : uint8_t { 72 DEFAULT = 0, // C03900 73 ACE_ALPHABET_INDEXER, // C03901 74 ACE_COUNTER, // C03902 75 ACE_SUB_WINDOW, // C03903 76 ACE_FORM, // C03904 77 ACE_DRAG, // C03905 78 ACE_VIDEO, // C03906 79 ACE_COMPONENT_SNAPSHOT, // C03907 80 ACE_CANVAS, // C03908 81 ACE_REFRESH, // C03909 82 ACE_SCROLL, // C0390A 83 ACE_SCROLLABLE, // C0390B 84 ACE_FONT, // C0390C 85 ACE_OVERLAY, // C0390D 86 ACE_DIALOG_TIMEPICKER, // C0390E 87 ACE_DIALOG, // C0390F 88 ACE_PANEL, // C03910 89 ACE_MENU, // C03911 90 ACE_TEXTINPUT, // C03912 91 ACE_TEXT, // C03913 92 ACE_TEXT_FIELD, // C03914 93 ACE_SWIPER, // C03915 94 ACE_TABS, // C03916 95 ACE_BLANK, // C03917 96 ACE_GRIDROW, // C03918 97 ACE_INPUTTRACKING, // C03919 98 ACE_RICH_TEXT, // C0391A 99 ACE_WEB, // C0391B 100 ACE_FOCUS, // C0391C 101 ACE_MOUSE, // C0391D 102 ACE_GESTURE, // C0391E 103 ACE_IMAGE, // C0391F 104 ACE_RATING, // C03920 105 ACE_LIST, // C03921 106 ACE_NAVIGATION, // C03922 107 ACE_WATERFLOW, // C03923 108 ACE_ACCESSIBILITY, // C03924 109 ACE_ROUTER, // C03925 110 ACE_THEME, // C03926 111 ACE_BORDER_IMAGE, // C03927 112 ACE_GRID, // C03928 113 ACE_PLUGIN_COMPONENT, // C03929 114 ACE_UIEXTENSIONCOMPONENT, // C0392A 115 ACE_IF, // C0392B 116 ACE_FOREACH, // C0392C 117 ACE_LAZY_FOREACH, // C0392D 118 ACE_GAUGE, // C0392E 119 ACE_HYPERLINK, // C0392F 120 ACE_ANIMATION, // C03930 121 ACE_XCOMPONENT, // C03931 122 ACE_AUTO_FILL, // C03932 123 ACE_KEYBOARD, // C03933 124 ACE_UIEVENT, // C03934 125 ACE_UI_SERVICE, // C03935 ace_engine/adapter/ohos/services/uiservice/src/ui_service_hilog.h 126 ACE_DISPLAY_SYNC, // C03936 127 ACE_RESOURCE, // C03937 128 ACE_SIDEBAR, // C03938 129 ACE_GEOMETRY_TRANSITION, // C03939 130 ACE_DOWNLOAD_MANAGER, // C0393A 131 ACE_WINDOW_SCENE, // C0393B 132 ACE_NODE_CONTAINER, // C0393C 133 ACE_NATIVE_NODE, // C0393D 134 ACE_DYNAMIC_COMPONENT, // C0393E 135 ACE_MARQUEE, // C0393F 136 ACE_OBSERVER, // C03940 137 ACE_EMBEDDED_COMPONENT, // C03941 138 ACE_TEXT_CLOCK, // C03942 139 ACE_FOLDER_STACK, // C03943 140 141 FORM_RENDER = 255, // C039FF FormRenderer 142 END = 256, // Last one, do not use 143 }; 144 145 enum class LogDomain : uint32_t { 146 FRAMEWORK = 0, 147 JS_APP, 148 }; 149 150 enum class LogLevel : uint32_t { 151 DEBUG = 0, 152 INFO, 153 WARN, 154 ERROR, 155 FATAL, 156 }; 157 158 class ACE_FORCE_EXPORT LogWrapper final { 159 public: JudgeLevel(LogLevel level)160 static bool JudgeLevel(LogLevel level) 161 { 162 if (level == LogLevel::DEBUG) { 163 return SystemProperties::GetDebugEnabled(); 164 } 165 return level_ <= level; 166 } 167 SetLogLevel(LogLevel level)168 static void SetLogLevel(LogLevel level) 169 { 170 level_ = level; 171 } 172 GetLogLevel()173 static LogLevel GetLogLevel() 174 { 175 return level_; 176 } 177 GetBriefFileName(const char * name)178 static const char* GetBriefFileName(const char* name) 179 { 180 static const char separator = GetSeparatorCharacter(); 181 const char* p = strrchr(name, separator); 182 return p != nullptr ? p + 1 : name; 183 } 184 StripFormatString(const std::string & prefix,std::string & str)185 static void StripFormatString(const std::string& prefix, std::string& str) 186 { 187 for (auto pos = str.find(prefix, 0); pos != std::string::npos; pos = str.find(prefix, pos)) { 188 str.erase(pos, prefix.size()); 189 } 190 } 191 ReplaceFormatString(const std::string & prefix,const std::string & replace,std::string & str)192 static void ReplaceFormatString(const std::string& prefix, const std::string& replace, std::string& str) 193 { 194 for (auto pos = str.find(prefix, 0); pos != std::string::npos; pos = str.find(prefix, pos)) { 195 str.replace(pos, prefix.size(), replace); 196 } 197 } 198 PrintLog(LogDomain domain,LogLevel level,AceLogTag tag,const char * fmt,...)199 static void PrintLog(LogDomain domain, LogLevel level, AceLogTag tag, const char* fmt, ...) 200 __attribute__((__format__(os_log, 4, 5))) 201 { 202 va_list args; 203 va_start(args, fmt); 204 PrintLog(domain, level, tag, fmt, args); 205 va_end(args); 206 } 207 208 // MUST implement these interface on each platform. 209 static char GetSeparatorCharacter(); 210 static void PrintLog(LogDomain domain, LogLevel level, AceLogTag tag, const char* fmt, va_list args); 211 #ifdef ACE_INSTANCE_LOG 212 static int32_t GetId(); 213 static const std::string GetIdWithReason(); 214 #endif 215 216 private: 217 LogWrapper() = delete; 218 ~LogWrapper() = delete; 219 220 static LogLevel level_; 221 }; 222 223 } // namespace OHOS::Ace 224 225 #endif // FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_LOG_WRAPPER_H 226