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