• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 BASE_EVENTHANDLER_INTERFACES_INNER_API_EVENT_LOGGER_H
17 #define BASE_EVENTHANDLER_INTERFACES_INNER_API_EVENT_LOGGER_H
18 
19 #include <cinttypes>
20 #include <functional>
21 #include <future>
22 #include <string>
23 #include <sstream>
24 
25 #include "hilog/log.h"
26 
27 namespace OHOS {
28 namespace AppExecFwk {
29 inline constexpr uint32_t EH_LOG_DOMAIN = 0xD001200;
30 
31 class InnerFunctionTracer {
32 public:
33     using HilogFunc = std::function<int(const char *)>;
34 
InnerFunctionTracer(HilogFunc logfn,const char * tag,LogLevel level)35     InnerFunctionTracer(HilogFunc logfn, const char* tag, LogLevel level)
36         : logfn_(logfn), tag_(tag), level_(level)
37     {
38         if (HiLogIsLoggable(OHOS::AppExecFwk::EH_LOG_DOMAIN, tag_, level_)) {
39             if (logfn_ != nullptr) {
40                 logfn_("in %{public}s, enter");
41             }
42         }
43     }
~InnerFunctionTracer()44     ~InnerFunctionTracer()
45     {
46         if (HiLogIsLoggable(OHOS::AppExecFwk::EH_LOG_DOMAIN, tag_, level_)) {
47             if (logfn_ != nullptr) {
48                 logfn_("in %{public}s, leave");
49             }
50         }
51     }
52 private:
53     HilogFunc logfn_ { nullptr };
54     const char* tag_ { nullptr };
55     LogLevel level_ { LOG_LEVEL_MIN };
56 };
57 } // namespace AppExecFwk
58 } // namespace OHOS
59 
60 #ifndef EH_FUNC_FMT
61 #define EH_FUNC_FMT "in %{public}s:%{public}d, "
62 #endif
63 
64 #ifndef EH_FUNC_INFO
65 #define EH_FUNC_INFO __FUNCTION__, __LINE__
66 #endif
67 
68 #ifndef EH_FILE_NAME
69 #define EH_FILE_NAME   (strrchr((__FILE__), '/') ? strrchr((__FILE__), '/') + 1 : (__FILE__))
70 #endif
71 
72 #ifndef EH_LINE_INFO
73 #define EH_LINE_INFO   EH_FILE_NAME, __LINE__
74 #endif
75 
76 #define DEFINE_EH_HILOG_LABEL(name) \
77     static const constexpr char* EH_LOG_LABEL = (name)
78 
79 #define HILOGD(fmt, ...) do { \
80     if (HiLogIsLoggable(OHOS::AppExecFwk::EH_LOG_DOMAIN, EH_LOG_LABEL, LOG_DEBUG)) { \
81         ((void)HILOG_IMPL(LOG_CORE, LOG_INFO, EH_LOG_DOMAIN, EH_LOG_LABEL, fmt, ##__VA_ARGS__)); \
82     } \
83 } while (0)
84 
85 #define HILOGI(fmt, ...) do { \
86     ((void)HILOG_IMPL(LOG_CORE, LOG_INFO, EH_LOG_DOMAIN, EH_LOG_LABEL, fmt, ##__VA_ARGS__)); \
87 } while (0)
88 
89 #define HILOGW(fmt, ...) do { \
90     ((void)HILOG_IMPL(LOG_CORE, LOG_WARN, EH_LOG_DOMAIN, EH_LOG_LABEL, fmt, ##__VA_ARGS__)); \
91 } while (0)
92 
93 #define HILOGE(fmt, ...) do { \
94     ((void)HILOG_IMPL(LOG_CORE, LOG_ERROR, EH_LOG_DOMAIN, EH_LOG_LABEL, fmt, ##__VA_ARGS__)); \
95 } while (0)
96 
97 #define HILOGF(fmt, ...) do { \
98     ((void)HILOG_IMPL(LOG_CORE, LOG_FATAL, EH_LOG_DOMAIN, EH_LOG_LABEL, fmt, ##__VA_ARGS__)); \
99 } while (0)
100 
101 #ifndef EH_CALL_DEBUG_ENTER
102 #define EH_CALL_DEBUG_ENTER        ::OHOS::AppExecFwk::InnerFunctionTracer ___innerFuncTracer_Debug___   \
103     { std::bind(&::OHOS::HiviewDFX::HiLog::Debug, EH_LOG_LABEL, std::placeholders::_1,                   \
104       __FUNCTION__), EH_LOG_LABEL.tag, LOG_DEBUG }
105 #endif // EH_CALL_DEBUG_ENTER
106 
107 #ifndef EH_CALL_INFO_TRACE
108 #define EH_CALL_INFO_TRACE         ::OHOS::AppExecFwk::InnerFunctionTracer ___innerFuncTracer_Info___    \
109     { std::bind(&::OHOS::HiviewDFX::HiLog::Info, EH_LOG_LABEL, std::placeholders::_1,                    \
110       __FUNCTION__), EH_LOG_LABEL.tag, LOG_INFO }
111 #endif // EH_CALL_INFO_TRACE
112 
113 #ifndef EH_CALL_TEST_DEBUG
114 #define EH_CALL_TEST_DEBUG         ::OHOS::AppExecFwk::InnerFunctionTracer ___innerFuncTracer_Info___    \
115     { std::bind(&::OHOS::HiviewDFX::HiLog::Info, EH_LOG_LABEL, std::placeholders::_1,                    \
116       (test_info_ == nullptr ? "TestBody" : test_info_->name())), EH_LOG_LABEL.tag, LOG_DEBUG }
117 #endif // EH_CALL_TEST_DEBUG
118 
119 #endif // BASE_EVENTHANDLER_INTERFACES_INNER_API_EVENT_LOGGER_H
120