1d96309c9Sopenharmony_ci/* 2d96309c9Sopenharmony_ci * Copyright (c) 2020 Huawei Device Co., Ltd. 3d96309c9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d96309c9Sopenharmony_ci * you may not use this file except in compliance with the License. 5d96309c9Sopenharmony_ci * You may obtain a copy of the License at 6d96309c9Sopenharmony_ci * 7d96309c9Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d96309c9Sopenharmony_ci * 9d96309c9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d96309c9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d96309c9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d96309c9Sopenharmony_ci * See the License for the specific language governing permissions and 13d96309c9Sopenharmony_ci * limitations under the License. 14d96309c9Sopenharmony_ci */ 15d96309c9Sopenharmony_ci 16d96309c9Sopenharmony_ci#include <string.h> 17d96309c9Sopenharmony_ci#include <stdarg.h> 18d96309c9Sopenharmony_ci#include <stdio.h> 19d96309c9Sopenharmony_ci#include "ohos_init.h" 20d96309c9Sopenharmony_ci#include "hiview_def.h" 21d96309c9Sopenharmony_ci#include "hiview_util.h" 22d96309c9Sopenharmony_ci#include "hiview_config.h" 23d96309c9Sopenharmony_ci#include "hiview_service.h" 24d96309c9Sopenharmony_ci#include "hiview_log.h" 25d96309c9Sopenharmony_ci#include "hiview_log_limit.h" 26d96309c9Sopenharmony_ci#include "hiview_output_log.h" 27d96309c9Sopenharmony_ci 28d96309c9Sopenharmony_ci#define LOG_IS_OUTPUT(mod) (g_hiviewConfig.logOutputModule & (((uint64_t)1) << (mod))) 29d96309c9Sopenharmony_ci 30d96309c9Sopenharmony_cistatic HiLogModuleInfo g_logModuleInfo[HILOG_MODULE_MAX]; 31d96309c9Sopenharmony_ciconst char * const FUN_ARG_S = "0123456I"; 32d96309c9Sopenharmony_ci 33d96309c9Sopenharmony_cistatic boolean CheckParameters(uint8 module, uint8 level); 34d96309c9Sopenharmony_ci 35d96309c9Sopenharmony_ci/* The first step does not involve memory allocation. */ 36d96309c9Sopenharmony_cistatic void HiLogInit(void) 37d96309c9Sopenharmony_ci{ 38d96309c9Sopenharmony_ci HIVIEW_UartPrint("hilog will init.\n"); 39d96309c9Sopenharmony_ci InitCoreLogOutput(); 40d96309c9Sopenharmony_ci 41d96309c9Sopenharmony_ci /* The module that is not registered cannot print the log. */ 42d96309c9Sopenharmony_ci if (HiLogRegisterModule(HILOG_MODULE_HIVIEW, "HIVIEW") == FALSE || 43d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_SAMGR, "SAMGR") == FALSE || 44d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_UPDATE, "UPDATE") == FALSE || 45d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_ACE, "ACE") == FALSE || 46d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_AAFWK, "AAFWK") == FALSE || 47d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_APP, "APP") == FALSE || 48d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_GRAPHIC, "GRAPHIC") == FALSE || 49d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_MEDIA, "MEDIA") == FALSE || 50d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_DMS, "DMS") == FALSE || 51d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_SEN, "SEN") == FALSE || 52d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_SCY, "SCY") == FALSE || 53d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_SOFTBUS, "SOFTBUS") == FALSE || 54d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_POWERMGR, "POWERMGR") == FALSE || 55d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_UIKIT, "UIKIT") == FALSE || 56d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_GLOBAL, "GLOBAL") == FALSE || 57d96309c9Sopenharmony_ci HiLogRegisterModule(HILOG_MODULE_DATAMGR, "DATAMGR") == FALSE) { 58d96309c9Sopenharmony_ci return; 59d96309c9Sopenharmony_ci } 60d96309c9Sopenharmony_ci 61d96309c9Sopenharmony_ci HiviewRegisterInitFunc(HIVIEW_CMP_TYPE_LOG, InitLogOutput); 62d96309c9Sopenharmony_ci HiviewRegisterInitFunc(HIVIEW_CMP_TYPE_LOG_LIMIT, InitLogLimit); 63d96309c9Sopenharmony_ci HILOG_DEBUG(HILOG_MODULE_HIVIEW, "hilog init success."); 64d96309c9Sopenharmony_ci} 65d96309c9Sopenharmony_ciCORE_INIT_PRI(HiLogInit, 0); 66d96309c9Sopenharmony_ci 67d96309c9Sopenharmony_cistatic boolean CheckParameters(uint8 module, uint8 level) 68d96309c9Sopenharmony_ci{ 69d96309c9Sopenharmony_ci if ((level < g_hiviewConfig.level) || (level < HILOG_COMPILE_LEVEL) || 70d96309c9Sopenharmony_ci (module >= HILOG_MODULE_MAX) || (g_logModuleInfo[module].name == NULL)) { 71d96309c9Sopenharmony_ci return FALSE; 72d96309c9Sopenharmony_ci } 73d96309c9Sopenharmony_ci 74d96309c9Sopenharmony_ci return TRUE; 75d96309c9Sopenharmony_ci} 76d96309c9Sopenharmony_ci 77d96309c9Sopenharmony_ciboolean HiLogRegisterModule(uint16 id, const char *name) 78d96309c9Sopenharmony_ci{ 79d96309c9Sopenharmony_ci if ((id >= HILOG_MODULE_MAX) || name == NULL || g_logModuleInfo[id].name != NULL) { 80d96309c9Sopenharmony_ci return FALSE; 81d96309c9Sopenharmony_ci } 82d96309c9Sopenharmony_ci 83d96309c9Sopenharmony_ci uint32 len = (uint32)strnlen(name, LOG_MODULE_NAME_LEN + 1); 84d96309c9Sopenharmony_ci if (len >= LOG_MODULE_NAME_LEN - 1) { 85d96309c9Sopenharmony_ci return FALSE; 86d96309c9Sopenharmony_ci } 87d96309c9Sopenharmony_ci uint32 i = 0; 88d96309c9Sopenharmony_ci while (i < len && name[i] != 0) { 89d96309c9Sopenharmony_ci if (!((name[i] >= 'a' && name[i] <= 'z') || (name[i] >= 'A' && name[i] <= 'Z'))) { 90d96309c9Sopenharmony_ci return FALSE; 91d96309c9Sopenharmony_ci } 92d96309c9Sopenharmony_ci i++; 93d96309c9Sopenharmony_ci } 94d96309c9Sopenharmony_ci 95d96309c9Sopenharmony_ci g_logModuleInfo[id].name = name; 96d96309c9Sopenharmony_ci g_logModuleInfo[id].id = id; 97d96309c9Sopenharmony_ci return TRUE; 98d96309c9Sopenharmony_ci} 99d96309c9Sopenharmony_ci 100d96309c9Sopenharmony_ciconst char *HiLogGetModuleName(uint8 id) 101d96309c9Sopenharmony_ci{ 102d96309c9Sopenharmony_ci if (id >= HILOG_MODULE_MAX) { 103d96309c9Sopenharmony_ci return ""; 104d96309c9Sopenharmony_ci } 105d96309c9Sopenharmony_ci const char *name = g_logModuleInfo[id].name; 106d96309c9Sopenharmony_ci return (name == NULL) ? "" : name; 107d96309c9Sopenharmony_ci} 108d96309c9Sopenharmony_ci 109d96309c9Sopenharmony_civoid HiLogPrintf(uint8 module, uint8 level, const char *nums, const char *fmt, ...) 110d96309c9Sopenharmony_ci{ 111d96309c9Sopenharmony_ci static char newFmt[] = "The number of parameters is invalid."; 112d96309c9Sopenharmony_ci HiLogContent logContent = { 0 }; 113d96309c9Sopenharmony_ci int32 argsNum = (nums - FUN_ARG_S); 114d96309c9Sopenharmony_ci if (argsNum < 0 || argsNum > LOG_MULTI_PARA_MAX) { 115d96309c9Sopenharmony_ci fmt = newFmt; 116d96309c9Sopenharmony_ci argsNum = 0; 117d96309c9Sopenharmony_ci } 118d96309c9Sopenharmony_ci 119d96309c9Sopenharmony_ci if (g_hiviewConfig.logSwitch == HIVIEW_FEATURE_OFF || !CheckParameters(module, level) || 120d96309c9Sopenharmony_ci !LOG_IS_OUTPUT(module)) { 121d96309c9Sopenharmony_ci return; 122d96309c9Sopenharmony_ci } 123d96309c9Sopenharmony_ci 124d96309c9Sopenharmony_ci HiLogCommon *pCommon = &(logContent.commonContent); 125d96309c9Sopenharmony_ci pCommon->head = LOG_INFO_HEAD; 126d96309c9Sopenharmony_ci pCommon->module = module; 127d96309c9Sopenharmony_ci pCommon->level = level; 128d96309c9Sopenharmony_ci pCommon->fmt = fmt; 129d96309c9Sopenharmony_ci pCommon->valueNumber = (uint8)argsNum; 130d96309c9Sopenharmony_ci pCommon->task = (uint8)HIVIEW_GetTaskId(); 131d96309c9Sopenharmony_ci uint64 cur = HIVIEW_GetCurrentTime(); 132d96309c9Sopenharmony_ci pCommon->time = (uint32)(cur / MS_PER_SECOND); 133d96309c9Sopenharmony_ci pCommon->milli = (uint16)(cur % MS_PER_SECOND); 134d96309c9Sopenharmony_ci 135d96309c9Sopenharmony_ci uint8 i = 0; 136d96309c9Sopenharmony_ci va_list args; 137d96309c9Sopenharmony_ci va_start(args, fmt); 138d96309c9Sopenharmony_ci while (i < argsNum) { 139d96309c9Sopenharmony_ci logContent.values[i++] = va_arg(args, uint32); 140d96309c9Sopenharmony_ci } 141d96309c9Sopenharmony_ci va_end(args); 142d96309c9Sopenharmony_ci 143d96309c9Sopenharmony_ci OutputLog((uint8 *)&logContent, sizeof(HiLogCommon) + sizeof(uint32) * argsNum); 144d96309c9Sopenharmony_ci} 145d96309c9Sopenharmony_ci 146d96309c9Sopenharmony_civoid HILOG_HashPrintf(uint8 module, uint8 level, const char *nums, uint32 hash, ...) 147d96309c9Sopenharmony_ci{ 148d96309c9Sopenharmony_ci HiLogContent logContent = {0}; 149d96309c9Sopenharmony_ci int32 argsNum = (nums - FUN_ARG_S); 150d96309c9Sopenharmony_ci if (argsNum < 0 || argsNum > LOG_MULTI_PARA_MAX) { 151d96309c9Sopenharmony_ci argsNum = 0; 152d96309c9Sopenharmony_ci } 153d96309c9Sopenharmony_ci 154d96309c9Sopenharmony_ci if (g_hiviewConfig.logSwitch == HIVIEW_FEATURE_OFF || !CheckParameters(module, level) || 155d96309c9Sopenharmony_ci !LOG_IS_OUTPUT(module)) { 156d96309c9Sopenharmony_ci return; 157d96309c9Sopenharmony_ci } 158d96309c9Sopenharmony_ci 159d96309c9Sopenharmony_ci HiLogCommon *pCommon = &(logContent.commonContent); 160d96309c9Sopenharmony_ci pCommon->head = LOG_INFO_HEAD; 161d96309c9Sopenharmony_ci pCommon->module = module; 162d96309c9Sopenharmony_ci pCommon->level = SET_HASH_FLAG(level); 163d96309c9Sopenharmony_ci pCommon->fmt = (const char*)hash; 164d96309c9Sopenharmony_ci pCommon->valueNumber = (uint8)argsNum; 165d96309c9Sopenharmony_ci pCommon->task = (uint8)HIVIEW_GetTaskId(); 166d96309c9Sopenharmony_ci uint64 cur = HIVIEW_GetCurrentTime(); 167d96309c9Sopenharmony_ci pCommon->time = (uint32)(cur / MS_PER_SECOND); 168d96309c9Sopenharmony_ci pCommon->milli = (uint16)(cur % MS_PER_SECOND); 169d96309c9Sopenharmony_ci 170d96309c9Sopenharmony_ci uint8 i = 0; 171d96309c9Sopenharmony_ci va_list args; 172d96309c9Sopenharmony_ci va_start(args, hash); 173d96309c9Sopenharmony_ci while (i < argsNum) { 174d96309c9Sopenharmony_ci logContent.values[i++] = va_arg(args, uint32); 175d96309c9Sopenharmony_ci } 176d96309c9Sopenharmony_ci va_end(args); 177d96309c9Sopenharmony_ci 178d96309c9Sopenharmony_ci OutputLog((uint8 *)&logContent, sizeof(HiLogCommon) + sizeof(uint32) * argsNum); 179d96309c9Sopenharmony_ci} 180d96309c9Sopenharmony_ci 181d96309c9Sopenharmony_civoid HiLogFlush(boolean syncFlag) 182d96309c9Sopenharmony_ci{ 183d96309c9Sopenharmony_ci FlushLog(syncFlag); 184d96309c9Sopenharmony_ci} 185d96309c9Sopenharmony_ci 186d96309c9Sopenharmony_ciuint32 HiLogGetConfigOption(void) 187d96309c9Sopenharmony_ci{ 188d96309c9Sopenharmony_ci return HiviewGetConfigOption(); 189d96309c9Sopenharmony_ci} 190d96309c9Sopenharmony_ci 191d96309c9Sopenharmony_civoid HiLogRegisterProc(HilogProc func) 192d96309c9Sopenharmony_ci{ 193d96309c9Sopenharmony_ci HiviewRegisterHilogProc(func); 194d96309c9Sopenharmony_ci} 195d96309c9Sopenharmony_ci 196d96309c9Sopenharmony_civoid HiLogUnRegisterProc(HilogProc func) 197d96309c9Sopenharmony_ci{ 198d96309c9Sopenharmony_ci HiviewUnRegisterHilogProc(func); 199d96309c9Sopenharmony_ci} 200d96309c9Sopenharmony_ci 201d96309c9Sopenharmony_civoid HiLogFileAddWatcher(FileProc func, const char *path) 202d96309c9Sopenharmony_ci{ 203d96309c9Sopenharmony_ci HiviewRegisterHiLogFileWatcher(func, path); 204d96309c9Sopenharmony_ci} 205d96309c9Sopenharmony_ci 206d96309c9Sopenharmony_civoid HiLogFileRemoveWatcher(FileProc func) 207d96309c9Sopenharmony_ci{ 208d96309c9Sopenharmony_ci HiviewUnRegisterHiLogFileWatcher(func); 209d96309c9Sopenharmony_ci} 210d96309c9Sopenharmony_ci 211d96309c9Sopenharmony_ciint HiLogFileProc(const char *dest, uint8 mode) 212d96309c9Sopenharmony_ci{ 213d96309c9Sopenharmony_ci return HiLogFileProcImp(dest, mode); 214d96309c9Sopenharmony_ci} 215d96309c9Sopenharmony_ci 216d96309c9Sopenharmony_civoid HiLogOutputFileLock(void) 217d96309c9Sopenharmony_ci{ 218d96309c9Sopenharmony_ci HiLogOutputFileLockImp(); 219d96309c9Sopenharmony_ci} 220d96309c9Sopenharmony_ci 221d96309c9Sopenharmony_civoid HiLogOutputFileUnLock(void) 222d96309c9Sopenharmony_ci{ 223d96309c9Sopenharmony_ci HiLogOutputFileUnLockImp(); 224d96309c9Sopenharmony_ci} 225d96309c9Sopenharmony_ci 226d96309c9Sopenharmony_ciuint32 HiLogGetLogLevel(void) 227d96309c9Sopenharmony_ci{ 228d96309c9Sopenharmony_ci return g_hiviewConfig.level; 229d96309c9Sopenharmony_ci} 230d96309c9Sopenharmony_ci 231d96309c9Sopenharmony_ciboolean HiLogSetLogLevel(uint8 level) 232d96309c9Sopenharmony_ci{ 233d96309c9Sopenharmony_ci if (level >= HILOG_LV_DEBUG && level < HILOG_LV_MAX) { 234d96309c9Sopenharmony_ci g_hiviewConfig.level = level; 235d96309c9Sopenharmony_ci printf("Set log level: %d\n", level); 236d96309c9Sopenharmony_ci return TRUE; 237d96309c9Sopenharmony_ci } 238d96309c9Sopenharmony_ci return FALSE; 239d96309c9Sopenharmony_ci} 240