• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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