1 /* 2 * Copyright (c) 2021 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_NOTIFICATION_ANS_STANDARD_INNERKITS_BASE_INCLUDE_ANS_LOG_HELPER_H 17 #define BASE_NOTIFICATION_ANS_STANDARD_INNERKITS_BASE_INCLUDE_ANS_LOG_HELPER_H 18 19 #include <stdint.h> // for uint8_t 20 #include <string> // for basic_string 21 22 #include "hilog/log.h" 23 #include <chrono> 24 25 namespace OHOS { 26 namespace Notification { 27 #ifndef ANS_LOG_DOMAIN 28 #define ANS_LOG_DOMAIN 0xD001203 29 #endif 30 31 #ifndef ANS_LOG_TAG 32 #define ANS_LOG_TAG "Ans" 33 #endif 34 35 #ifndef ANS_REMINDER_LOG_TAG 36 #define ANS_REMINDER_LOG_TAG "ANS_REMINDER" 37 #endif 38 39 #define ANS_LOG_LIMIT_INTERVALS 10000 //ms 40 41 #define CUR_FILENAME (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__) 42 43 #define ANS_LOGF(fmt, ...) \ 44 ((void)HILOG_IMPL(LOG_CORE, LOG_FATAL, ANS_LOG_DOMAIN, ANS_LOG_TAG, \ 45 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 46 #define ANS_LOGE(fmt, ...) \ 47 ((void)HILOG_IMPL(LOG_CORE, LOG_ERROR, ANS_LOG_DOMAIN, ANS_LOG_TAG, \ 48 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 49 #define ANS_LOGW(fmt, ...) \ 50 ((void)HILOG_IMPL(LOG_CORE, LOG_WARN, ANS_LOG_DOMAIN, ANS_LOG_TAG, \ 51 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 52 #define ANS_LOGI(fmt, ...) \ 53 ((void)HILOG_IMPL(LOG_CORE, LOG_INFO, ANS_LOG_DOMAIN, ANS_LOG_TAG, \ 54 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 55 #define ANS_LOGD(fmt, ...) \ 56 ((void)HILOG_IMPL(LOG_CORE, LOG_DEBUG, ANS_LOG_DOMAIN, ANS_LOG_TAG, \ 57 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 58 59 #define ANSR_LOGF(fmt, ...) \ 60 ((void)HILOG_IMPL(LOG_CORE, LOG_FATAL, ANS_LOG_DOMAIN, ANS_REMINDER_LOG_TAG, \ 61 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 62 #define ANSR_LOGE(fmt, ...) \ 63 ((void)HILOG_IMPL(LOG_CORE, LOG_ERROR, ANS_LOG_DOMAIN, ANS_REMINDER_LOG_TAG, \ 64 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 65 #define ANSR_LOGW(fmt, ...) \ 66 ((void)HILOG_IMPL(LOG_CORE, LOG_WARN, ANS_LOG_DOMAIN, ANS_REMINDER_LOG_TAG, \ 67 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 68 #define ANSR_LOGI(fmt, ...) \ 69 ((void)HILOG_IMPL(LOG_CORE, LOG_INFO, ANS_LOG_DOMAIN, ANS_REMINDER_LOG_TAG, \ 70 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 71 #define ANSR_LOGD(fmt, ...) \ 72 ((void)HILOG_IMPL(LOG_CORE, LOG_DEBUG, ANS_LOG_DOMAIN, ANS_REMINDER_LOG_TAG, \ 73 "[%{public}s(%{public}s:%{public}d)]" fmt, CUR_FILENAME, __FUNCTION__, __LINE__, ##__VA_ARGS__)) 74 75 #define ANS_PRINT_LIMIT(type, level, intervals, canPrint) \ 76 do { \ 77 static auto last = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>(); \ 78 static uint32_t supressed = 0; \ 79 auto now = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); \ 80 auto duration = now - last; \ 81 if (duration.count() >= (intervals)) { \ 82 last = now; \ 83 uint32_t supressedCnt = supressed; \ 84 supressed = 0; \ 85 if (supressedCnt != 0) { \ 86 ((void)HILOG_IMPL((type), (level), ANS_LOG_DOMAIN, ANS_REMINDER_LOG_TAG, \ 87 "[%{public}s(%{public}s:%{public}d)]log suppressed cnt %{public}u", \ 88 CUR_FILENAME, __FUNCTION__, __LINE__, supressedCnt)); \ 89 } \ 90 (canPrint) = true; \ 91 } else { \ 92 supressed++; \ 93 (canPrint) = false; \ 94 } \ 95 } while (0) 96 97 #define ANS_LOGF_LIMIT(fmt, ...) \ 98 do { \ 99 bool can = true; \ 100 ANS_PRINT_LIMIT(LOG_CORE, LOG_FATAL, ANS_LOG_LIMIT_INTERVALS, can); \ 101 if (can) { \ 102 ANS_LOGF(fmt, ##__VA_ARGS__); \ 103 } \ 104 } while (0) 105 106 #define ANS_LOGE_LIMIT(fmt, ...) \ 107 do { \ 108 bool can = true; \ 109 ANS_PRINT_LIMIT(LOG_CORE, LOG_ERROR, ANS_LOG_LIMIT_INTERVALS, can); \ 110 if (can) { \ 111 ANS_LOGE(fmt, ##__VA_ARGS__); \ 112 } \ 113 } while (0) 114 115 116 #define ANS_LOGW_LIMIT(fmt, ...) \ 117 do { \ 118 bool can = true; \ 119 ANS_PRINT_LIMIT(LOG_CORE, LOG_WARN, ANS_LOG_LIMIT_INTERVALS, can); \ 120 if (can) { \ 121 ANS_LOGW(fmt, ##__VA_ARGS__); \ 122 } \ 123 } while (0) 124 125 126 #define ANS_LOGI_LIMIT(fmt, ...) \ 127 do { \ 128 bool can = true; \ 129 ANS_PRINT_LIMIT(LOG_CORE, LOG_INFO, ANS_LOG_LIMIT_INTERVALS, can); \ 130 if (can) { \ 131 ANS_LOGI(fmt, ##__VA_ARGS__); \ 132 } \ 133 } while (0) 134 135 #define ANS_LOGD_LIMIT(fmt, ...) \ 136 do { \ 137 bool can = true; \ 138 ANS_PRINT_LIMIT(LOG_CORE, LOG_DEBUG, ANS_LOG_LIMIT_INTERVALS, can); \ 139 if (can) { \ 140 ANS_LOGD(fmt, ##__VA_ARGS__); \ 141 } \ 142 } while (0) 143 } // namespace Notification 144 } // namespace OHOS 145 #endif // BASE_NOTIFICATION_ANS_STANDARD_INNERKITS_BASE_INCLUDE_ANS_LOG_HELPER_H 146