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