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