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