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 "hiview_output_log.h"
17d96309c9Sopenharmony_ci#include "hiview_cache.h"
18d96309c9Sopenharmony_ci#include "hiview_config.h"
19d96309c9Sopenharmony_ci#include "hiview_def.h"
20d96309c9Sopenharmony_ci#include "hiview_file.h"
21d96309c9Sopenharmony_ci#include "hiview_log.h"
22d96309c9Sopenharmony_ci#include "hiview_log_limit.h"
23d96309c9Sopenharmony_ci#include "hiview_service.h"
24d96309c9Sopenharmony_ci#include "hiview_util.h"
25d96309c9Sopenharmony_ci#include "message.h"
26d96309c9Sopenharmony_ci#include "ohos_types.h"
27d96309c9Sopenharmony_ci#include "securec.h"
28d96309c9Sopenharmony_ci
29d96309c9Sopenharmony_ci#include <time.h>
30d96309c9Sopenharmony_ci
31d96309c9Sopenharmony_ci#define SINGLE_FMT_MAX_LEN      8
32d96309c9Sopenharmony_ci#define FMT_CONVERT_TRMINATOR   2
33d96309c9Sopenharmony_ci#define INI_CONVERT_DIVID_NUM 10
34d96309c9Sopenharmony_ci
35d96309c9Sopenharmony_cistatic char g_logLevelInfo[HILOG_LV_MAX] = {
36d96309c9Sopenharmony_ci    'N', // "NONE"
37d96309c9Sopenharmony_ci    'D', // "DEBUG"
38d96309c9Sopenharmony_ci    'I', // "INFO"
39d96309c9Sopenharmony_ci    'W', // "WARN"
40d96309c9Sopenharmony_ci    'E', // "ERROR"
41d96309c9Sopenharmony_ci    'F'  // "FATAL"
42d96309c9Sopenharmony_ci};
43d96309c9Sopenharmony_ci
44d96309c9Sopenharmony_ci#ifndef DISABLE_HILOG_CACHE
45d96309c9Sopenharmony_cistatic uint8 g_logCacheBuffer[LOG_STATIC_CACHE_SIZE];
46d96309c9Sopenharmony_ci#endif
47d96309c9Sopenharmony_cistatic HiviewCache g_logCache = {
48d96309c9Sopenharmony_ci    .size = 0,
49d96309c9Sopenharmony_ci    .buffer = NULL,
50d96309c9Sopenharmony_ci};
51d96309c9Sopenharmony_cistatic HiviewFile g_logFile = {
52d96309c9Sopenharmony_ci    .path = HIVIEW_FILE_PATH_LOG,
53d96309c9Sopenharmony_ci    .outPath = HIVIEW_FILE_OUT_PATH_LOG,
54d96309c9Sopenharmony_ci    .pFunc = NULL,
55d96309c9Sopenharmony_ci    .mutex = NULL,
56d96309c9Sopenharmony_ci    .fhandle = -1,
57d96309c9Sopenharmony_ci    .configSize = 0,
58d96309c9Sopenharmony_ci};
59d96309c9Sopenharmony_ci
60d96309c9Sopenharmony_citypedef struct LogFlushInfo LogFlushInfo;
61d96309c9Sopenharmony_cistruct LogFlushInfo {
62d96309c9Sopenharmony_ci    HiviewMutexId_t mutex;
63d96309c9Sopenharmony_ci};
64d96309c9Sopenharmony_cistatic LogFlushInfo g_logFlushInfo;
65d96309c9Sopenharmony_cistatic HilogProc g_hilogOutputProc = NULL;
66d96309c9Sopenharmony_ci
67d96309c9Sopenharmony_citypedef struct OutputLogInfo OutputLogInfo;
68d96309c9Sopenharmony_cistruct OutputLogInfo {
69d96309c9Sopenharmony_ci    HiviewMutexId_t mutex;
70d96309c9Sopenharmony_ci};
71d96309c9Sopenharmony_cistatic OutputLogInfo g_outputLogInfo;
72d96309c9Sopenharmony_ci
73d96309c9Sopenharmony_cistatic int32 g_retryInitCount = 0;
74d96309c9Sopenharmony_ci#define MAX_RETRY_COUNT 100
75d96309c9Sopenharmony_ci
76d96309c9Sopenharmony_ci/* Output the log to UART using plaintext. */
77d96309c9Sopenharmony_cistatic void OutputLogRealtime(const Request *req);
78d96309c9Sopenharmony_ci/* Output the log to FLASH using text. */
79d96309c9Sopenharmony_cistatic void OutputLog2TextFile(const Request *req);
80d96309c9Sopenharmony_ci/* Output the log to FLASH using binary. */
81d96309c9Sopenharmony_cistatic void OutputLog2BinFile(const Request *req);
82d96309c9Sopenharmony_cistatic int32 LogCommonFmt(char *outStr, int32 outStrlen, const HiLogCommon *commonContentPtr);
83d96309c9Sopenharmony_cistatic int32 LogValuesFmt(char *desStrPtr, int32 desLen, const HiLogContent *logContentPtr);
84d96309c9Sopenharmony_cistatic int32 LogDebugValuesFmt(char *desStrPtr, int32 desLen, const HiLogContent *logContentPtr);
85d96309c9Sopenharmony_cistatic int32 LogValuesFmtHash(char *desStrPtr, int32 desLen, const HiLogContent *logContentPtr);
86d96309c9Sopenharmony_ci
87d96309c9Sopenharmony_civoid InitCoreLogOutput(void)
88d96309c9Sopenharmony_ci{
89d96309c9Sopenharmony_ci    g_logFlushInfo.mutex = HIVIEW_MutexInit();
90d96309c9Sopenharmony_ci    g_outputLogInfo.mutex = HIVIEW_MutexInit();
91d96309c9Sopenharmony_ci#ifndef DISABLE_HILOG_CACHE
92d96309c9Sopenharmony_ci    InitHiviewStaticCache(&g_logCache, LOG_CACHE, g_logCacheBuffer, sizeof(g_logCacheBuffer));
93d96309c9Sopenharmony_ci#endif
94d96309c9Sopenharmony_ci    HiviewRegisterMsgHandle(HIVIEW_MSG_OUTPUT_LOG_TEXT_FILE, OutputLog2TextFile);
95d96309c9Sopenharmony_ci    HiviewRegisterMsgHandle(HIVIEW_MSG_OUTPUT_LOG_BIN_FILE, OutputLog2BinFile);
96d96309c9Sopenharmony_ci    HiviewRegisterMsgHandle(HIVIEW_MSG_OUTPUT_LOG_FLOW, OutputLogRealtime);
97d96309c9Sopenharmony_ci}
98d96309c9Sopenharmony_ci
99d96309c9Sopenharmony_civoid InitLogOutput(void)
100d96309c9Sopenharmony_ci{
101d96309c9Sopenharmony_ci    int8 opt = GETOPTION(g_hiviewConfig.outputOption);
102d96309c9Sopenharmony_ci    if (opt == OUTPUT_OPTION_DEBUG || opt == OUTPUT_OPTION_FLOW) {
103d96309c9Sopenharmony_ci        return;
104d96309c9Sopenharmony_ci    }
105d96309c9Sopenharmony_ci    HiviewFileType type = HIVIEW_LOG_TEXT_FILE;
106d96309c9Sopenharmony_ci    if (opt == OUTPUT_OPTION_BIN_FILE) {
107d96309c9Sopenharmony_ci        type = HIVIEW_LOG_BIN_FILE;
108d96309c9Sopenharmony_ci    }
109d96309c9Sopenharmony_ci    if (InitHiviewFile(&g_logFile, type,
110d96309c9Sopenharmony_ci        (HIVIEW_LOG_FILE_SIZE / sizeof(HiLogContent)) * sizeof(HiLogContent)) == FALSE) {
111d96309c9Sopenharmony_ci        HIVIEW_UartPrint("Open file[HIVIEW_LOG_BIN_FILE] failed.");
112d96309c9Sopenharmony_ci    }
113d96309c9Sopenharmony_ci    g_logFile.mutex = g_outputLogInfo.mutex;
114d96309c9Sopenharmony_ci}
115d96309c9Sopenharmony_ci
116d96309c9Sopenharmony_civoid ClearLogOutput(void)
117d96309c9Sopenharmony_ci{
118d96309c9Sopenharmony_ci    int8 opt = GETOPTION(g_hiviewConfig.outputOption);
119d96309c9Sopenharmony_ci    if (g_logCache.usedSize > 0) {
120d96309c9Sopenharmony_ci        if (opt == OUTPUT_OPTION_TEXT_FILE) {
121d96309c9Sopenharmony_ci            OutputLog2TextFile(NULL);
122d96309c9Sopenharmony_ci        } else if (opt == OUTPUT_OPTION_BIN_FILE) {
123d96309c9Sopenharmony_ci            OutputLog2BinFile(NULL);
124d96309c9Sopenharmony_ci        }
125d96309c9Sopenharmony_ci    }
126d96309c9Sopenharmony_ci    CloseHiviewFile(&g_logFile);
127d96309c9Sopenharmony_ci}
128d96309c9Sopenharmony_ci
129d96309c9Sopenharmony_civoid OutputLog(const uint8 *data, uint32 len)
130d96309c9Sopenharmony_ci{
131d96309c9Sopenharmony_ci    if (data == NULL) {
132d96309c9Sopenharmony_ci        return;
133d96309c9Sopenharmony_ci    }
134d96309c9Sopenharmony_ci
135d96309c9Sopenharmony_ci    HiLogContent *hiLogContent = (HiLogContent *)data;
136d96309c9Sopenharmony_ci    if (g_hilogOutputProc != NULL) {
137d96309c9Sopenharmony_ci        if (g_hilogOutputProc(hiLogContent, len) == TRUE) {
138d96309c9Sopenharmony_ci            return;
139d96309c9Sopenharmony_ci        }
140d96309c9Sopenharmony_ci    }
141d96309c9Sopenharmony_ci
142d96309c9Sopenharmony_ci#ifdef DISABLE_HILOG_CACHE
143d96309c9Sopenharmony_ci    boolean isDisableCache = TRUE;
144d96309c9Sopenharmony_ci#else
145d96309c9Sopenharmony_ci    boolean isDisableCache = FALSE;
146d96309c9Sopenharmony_ci#endif
147d96309c9Sopenharmony_ci
148d96309c9Sopenharmony_ci#ifdef DISABLE_HILOG_LITE_PRINT_LIMIT
149d96309c9Sopenharmony_ci    boolean isDisablePrintLimited = TRUE;
150d96309c9Sopenharmony_ci#else
151d96309c9Sopenharmony_ci    boolean isDisablePrintLimited = FALSE;
152d96309c9Sopenharmony_ci#endif
153d96309c9Sopenharmony_ci    boolean isLogLimited = LogIsLimited(hiLogContent->commonContent.module);
154d96309c9Sopenharmony_ci    if (!isDisablePrintLimited && isLogLimited) {
155d96309c9Sopenharmony_ci        // The console output adopts the same restriction strategy as the file output,
156d96309c9Sopenharmony_ci        // and the log output to the file is restricted.
157d96309c9Sopenharmony_ci        return;
158d96309c9Sopenharmony_ci    }
159d96309c9Sopenharmony_ci
160d96309c9Sopenharmony_ci    int8 opt = GETOPTION(g_hiviewConfig.outputOption);
161d96309c9Sopenharmony_ci    boolean isPrint = g_hiviewConfig.outputOption >= OUTPUT_OPTION_PRINT;
162d96309c9Sopenharmony_ci    if (opt == OUTPUT_OPTION_DEBUG || isPrint || isDisableCache) {
163d96309c9Sopenharmony_ci        char tempOutStr[LOG_FMT_MAX_LEN] = {0};
164d96309c9Sopenharmony_ci        if (LogContentFmt(tempOutStr, sizeof(tempOutStr), data) > 0) {
165d96309c9Sopenharmony_ci            HIVIEW_UartPrint(tempOutStr);
166d96309c9Sopenharmony_ci        }
167d96309c9Sopenharmony_ci    }
168d96309c9Sopenharmony_ci
169d96309c9Sopenharmony_ci    if (opt == OUTPUT_OPTION_DEBUG || isDisableCache || isLogLimited) {
170d96309c9Sopenharmony_ci        return;
171d96309c9Sopenharmony_ci    }
172d96309c9Sopenharmony_ci
173d96309c9Sopenharmony_ci    /* When the init of kernel is not finished, data is cached in the cache. */
174d96309c9Sopenharmony_ci    if (g_hiviewConfig.hiviewInited == FALSE) {
175d96309c9Sopenharmony_ci        if (WriteToCache(&g_logCache, data, len) != (int32)len) {
176d96309c9Sopenharmony_ci            HIVIEW_UartPrint("Write log to cache failed.");
177d96309c9Sopenharmony_ci        }
178d96309c9Sopenharmony_ci        return;
179d96309c9Sopenharmony_ci    }
180d96309c9Sopenharmony_ci
181d96309c9Sopenharmony_ci    boolean writeFail = FALSE;
182d96309c9Sopenharmony_ci    if (WriteToCache(&g_logCache, (uint8 *)data, len) != (int32)len) {
183d96309c9Sopenharmony_ci        HIVIEW_UartPrint("Hilog writeToCache error!\n");
184d96309c9Sopenharmony_ci        writeFail = TRUE;
185d96309c9Sopenharmony_ci    }
186d96309c9Sopenharmony_ci    if (g_logCache.usedSize >= HIVIEW_HILOG_FILE_BUF_SIZE) {
187d96309c9Sopenharmony_ci        switch (opt) {
188d96309c9Sopenharmony_ci            case OUTPUT_OPTION_TEXT_FILE:
189d96309c9Sopenharmony_ci                HiviewSendMessage(HIVIEW_SERVICE, HIVIEW_MSG_OUTPUT_LOG_TEXT_FILE, 0);
190d96309c9Sopenharmony_ci                break;
191d96309c9Sopenharmony_ci            case OUTPUT_OPTION_BIN_FILE:
192d96309c9Sopenharmony_ci                HiviewSendMessage(HIVIEW_SERVICE, HIVIEW_MSG_OUTPUT_LOG_BIN_FILE, 0);
193d96309c9Sopenharmony_ci                break;
194d96309c9Sopenharmony_ci            case OUTPUT_OPTION_FLOW:
195d96309c9Sopenharmony_ci                HiviewSendMessage(HIVIEW_SERVICE, HIVIEW_MSG_OUTPUT_LOG_FLOW, 0);
196d96309c9Sopenharmony_ci                break;
197d96309c9Sopenharmony_ci            default:
198d96309c9Sopenharmony_ci                break;
199d96309c9Sopenharmony_ci        }
200d96309c9Sopenharmony_ci    }
201d96309c9Sopenharmony_ci
202d96309c9Sopenharmony_ci    /* If the cache fails to be written, write the cache again. */
203d96309c9Sopenharmony_ci    if (writeFail) {
204d96309c9Sopenharmony_ci        WriteToCache(&g_logCache, (uint8 *)data, len);
205d96309c9Sopenharmony_ci    }
206d96309c9Sopenharmony_ci}
207d96309c9Sopenharmony_ci
208d96309c9Sopenharmony_cistatic void OutputLogRealtime(const Request *req)
209d96309c9Sopenharmony_ci{
210d96309c9Sopenharmony_ci    HIVIEW_MutexLock(g_logFlushInfo.mutex);
211d96309c9Sopenharmony_ci    HiLogContent logContent;
212d96309c9Sopenharmony_ci    char tempOutStr[LOG_FMT_MAX_LEN] = {0};
213d96309c9Sopenharmony_ci    int32 len;
214d96309c9Sopenharmony_ci    (void)req;
215d96309c9Sopenharmony_ci
216d96309c9Sopenharmony_ci    while (ReadFromCache(&g_logCache, (uint8 *)&(logContent.commonContent),
217d96309c9Sopenharmony_ci        sizeof(HiLogCommon)) == sizeof(HiLogCommon)) {
218d96309c9Sopenharmony_ci        if (logContent.commonContent.head != LOG_INFO_HEAD) {
219d96309c9Sopenharmony_ci            DiscardCacheData(&g_logCache);
220d96309c9Sopenharmony_ci            HIVIEW_UartPrint("Discard cache[LOG_CACHE] data.");
221d96309c9Sopenharmony_ci            break;
222d96309c9Sopenharmony_ci        }
223d96309c9Sopenharmony_ci        len = logContent.commonContent.valueNumber * sizeof(uint32);
224d96309c9Sopenharmony_ci        if (len > 0 && ReadFromCache(&g_logCache, (uint8 *)&(logContent.values), len) != len) {
225d96309c9Sopenharmony_ci            continue;
226d96309c9Sopenharmony_ci        }
227d96309c9Sopenharmony_ci        len = LogContentFmt(tempOutStr, sizeof(tempOutStr), (uint8 *)&logContent);
228d96309c9Sopenharmony_ci        if (len <= 0) {
229d96309c9Sopenharmony_ci            continue;
230d96309c9Sopenharmony_ci        }
231d96309c9Sopenharmony_ci        HIVIEW_UartPrint(tempOutStr);
232d96309c9Sopenharmony_ci    }
233d96309c9Sopenharmony_ci    HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
234d96309c9Sopenharmony_ci}
235d96309c9Sopenharmony_ci
236d96309c9Sopenharmony_cistatic void OutputLog2TextFile(const Request *req)
237d96309c9Sopenharmony_ci{
238d96309c9Sopenharmony_ci    HIVIEW_MutexLock(g_logFlushInfo.mutex);
239d96309c9Sopenharmony_ci    HiLogContent logContent;
240d96309c9Sopenharmony_ci    char tempOutStr[LOG_FMT_MAX_LEN] = {0};
241d96309c9Sopenharmony_ci
242d96309c9Sopenharmony_ci    if (g_logCache.usedSize < sizeof(HiLogCommon)) {
243d96309c9Sopenharmony_ci        HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
244d96309c9Sopenharmony_ci        return;
245d96309c9Sopenharmony_ci    }
246d96309c9Sopenharmony_ci
247d96309c9Sopenharmony_ci    int32 len;
248d96309c9Sopenharmony_ci    while (ReadFromCache(&g_logCache, (uint8 *)&(logContent.commonContent),
249d96309c9Sopenharmony_ci        sizeof(HiLogCommon)) == sizeof(HiLogCommon)) {
250d96309c9Sopenharmony_ci        if (logContent.commonContent.head != LOG_INFO_HEAD) {
251d96309c9Sopenharmony_ci            DiscardCacheData(&g_logCache);
252d96309c9Sopenharmony_ci            HIVIEW_UartPrint("Discard cache[LOG_CACHE] data.");
253d96309c9Sopenharmony_ci            break;
254d96309c9Sopenharmony_ci        }
255d96309c9Sopenharmony_ci        len = logContent.commonContent.valueNumber * sizeof(uint32);
256d96309c9Sopenharmony_ci        if (len > 0 && ReadFromCache(&g_logCache, (uint8 *)&(logContent.values), len) != len) {
257d96309c9Sopenharmony_ci            continue;
258d96309c9Sopenharmony_ci        }
259d96309c9Sopenharmony_ci        len = LogContentFmt(tempOutStr, sizeof(tempOutStr), (uint8 *)&logContent);
260d96309c9Sopenharmony_ci        if (len > 0 && tempOutStr[len - 1] == '\0') {
261d96309c9Sopenharmony_ci            // prevent writing '\0' character to file
262d96309c9Sopenharmony_ci            len--;
263d96309c9Sopenharmony_ci        }
264d96309c9Sopenharmony_ci        if (g_logFile.fhandle < 0) {
265d96309c9Sopenharmony_ci            if (g_retryInitCount < MAX_RETRY_COUNT) {
266d96309c9Sopenharmony_ci                InitLogOutput();
267d96309c9Sopenharmony_ci            }
268d96309c9Sopenharmony_ci            g_retryInitCount++;
269d96309c9Sopenharmony_ci        } else {
270d96309c9Sopenharmony_ci            // once success, clean retry count
271d96309c9Sopenharmony_ci            g_retryInitCount = 0;
272d96309c9Sopenharmony_ci        }
273d96309c9Sopenharmony_ci        if (len > 0 && WriteToFile(&g_logFile, (uint8 *)tempOutStr, len) != len) {
274d96309c9Sopenharmony_ci            g_hiviewConfig.writeFailureCount++;
275d96309c9Sopenharmony_ci        }
276d96309c9Sopenharmony_ci    }
277d96309c9Sopenharmony_ci    HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
278d96309c9Sopenharmony_ci    if (req != NULL && req->msgValue == SYNC_FILE) {
279d96309c9Sopenharmony_ci        HIVIEW_FileSync(g_logFile.fhandle);
280d96309c9Sopenharmony_ci    }
281d96309c9Sopenharmony_ci}
282d96309c9Sopenharmony_ci
283d96309c9Sopenharmony_cistatic void OutputLog2BinFile(const Request *req)
284d96309c9Sopenharmony_ci{
285d96309c9Sopenharmony_ci    HIVIEW_MutexLock(g_logFlushInfo.mutex);
286d96309c9Sopenharmony_ci    HiLogCommon *pCommonContent = NULL;
287d96309c9Sopenharmony_ci    uint16 len = 0;
288d96309c9Sopenharmony_ci    uint16 valueLen;
289d96309c9Sopenharmony_ci    uint8 *tmpBuffer = NULL;
290d96309c9Sopenharmony_ci    uint16 outputSize = g_logCache.usedSize;
291d96309c9Sopenharmony_ci
292d96309c9Sopenharmony_ci    if (outputSize < sizeof(HiLogCommon)) {
293d96309c9Sopenharmony_ci        HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
294d96309c9Sopenharmony_ci        return;
295d96309c9Sopenharmony_ci    }
296d96309c9Sopenharmony_ci    tmpBuffer = (uint8 *)HIVIEW_MemAlloc(MEM_POOL_HIVIEW_ID, outputSize);
297d96309c9Sopenharmony_ci    if (tmpBuffer == NULL) {
298d96309c9Sopenharmony_ci        HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
299d96309c9Sopenharmony_ci        return;
300d96309c9Sopenharmony_ci    }
301d96309c9Sopenharmony_ci    while (g_logCache.usedSize >= sizeof(HiLogCommon) && outputSize > (len + sizeof(HiLogCommon))) {
302d96309c9Sopenharmony_ci        if (ReadFromCache(&g_logCache, tmpBuffer + len, sizeof(HiLogCommon)) != sizeof(HiLogCommon)) {
303d96309c9Sopenharmony_ci            continue;
304d96309c9Sopenharmony_ci        }
305d96309c9Sopenharmony_ci        pCommonContent = (HiLogCommon *)(tmpBuffer + len);
306d96309c9Sopenharmony_ci        len += sizeof(HiLogCommon);
307d96309c9Sopenharmony_ci        if (pCommonContent->head != LOG_INFO_HEAD) {
308d96309c9Sopenharmony_ci            DiscardCacheData(&g_logCache);
309d96309c9Sopenharmony_ci            HIVIEW_UartPrint("Discard cache[LOG_CACHE] data.");
310d96309c9Sopenharmony_ci            break;
311d96309c9Sopenharmony_ci        }
312d96309c9Sopenharmony_ci        valueLen = pCommonContent->valueNumber * sizeof(uint32);
313d96309c9Sopenharmony_ci        if (valueLen > 0) {
314d96309c9Sopenharmony_ci            if ((int32)len + (int32)valueLen > (int32)outputSize) {
315d96309c9Sopenharmony_ci                DiscardCacheData(&g_logCache);
316d96309c9Sopenharmony_ci                HIVIEW_UartPrint("Discard cache[LOG_CACHE] data.");
317d96309c9Sopenharmony_ci                break;
318d96309c9Sopenharmony_ci            }
319d96309c9Sopenharmony_ci            if (ReadFromCache(&g_logCache, tmpBuffer + len, valueLen) != valueLen) {
320d96309c9Sopenharmony_ci                continue;
321d96309c9Sopenharmony_ci            }
322d96309c9Sopenharmony_ci            len += valueLen;
323d96309c9Sopenharmony_ci        }
324d96309c9Sopenharmony_ci    }
325d96309c9Sopenharmony_ci    if (g_logFile.fhandle < 0) {
326d96309c9Sopenharmony_ci        if (g_retryInitCount < MAX_RETRY_COUNT) {
327d96309c9Sopenharmony_ci            InitLogOutput();
328d96309c9Sopenharmony_ci        }
329d96309c9Sopenharmony_ci        g_retryInitCount++;
330d96309c9Sopenharmony_ci    } else {
331d96309c9Sopenharmony_ci        // once success, clean retry count
332d96309c9Sopenharmony_ci        g_retryInitCount = 0;
333d96309c9Sopenharmony_ci    }
334d96309c9Sopenharmony_ci    if (len > 0 && WriteToFile(&g_logFile, tmpBuffer, len) != len) {
335d96309c9Sopenharmony_ci        g_hiviewConfig.writeFailureCount++;
336d96309c9Sopenharmony_ci        HIVIEW_UartPrint("Failed to write log data.");
337d96309c9Sopenharmony_ci    }
338d96309c9Sopenharmony_ci    HIVIEW_MemFree(MEM_POOL_HIVIEW_ID, tmpBuffer);
339d96309c9Sopenharmony_ci    HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
340d96309c9Sopenharmony_ci    if (req != NULL && req->msgValue == SYNC_FILE) {
341d96309c9Sopenharmony_ci        HIVIEW_FileSync(g_logFile.fhandle);
342d96309c9Sopenharmony_ci    }
343d96309c9Sopenharmony_ci}
344d96309c9Sopenharmony_ci
345d96309c9Sopenharmony_ciuint32 GetLogFileSize(void)
346d96309c9Sopenharmony_ci{
347d96309c9Sopenharmony_ci    return GetFileUsedSize(&g_logFile);
348d96309c9Sopenharmony_ci}
349d96309c9Sopenharmony_ci
350d96309c9Sopenharmony_ciuint32 ReadLogFile(uint8 *buf, uint32 len)
351d96309c9Sopenharmony_ci{
352d96309c9Sopenharmony_ci    if (buf == NULL) {
353d96309c9Sopenharmony_ci        return 0;
354d96309c9Sopenharmony_ci    }
355d96309c9Sopenharmony_ci    uint32 usedSize = GetFileUsedSize(&g_logFile);
356d96309c9Sopenharmony_ci    if (usedSize < len) {
357d96309c9Sopenharmony_ci        len = usedSize;
358d96309c9Sopenharmony_ci    }
359d96309c9Sopenharmony_ci    if (ReadFromFile(&g_logFile, buf, len) != (int32)len) {
360d96309c9Sopenharmony_ci        return 0;
361d96309c9Sopenharmony_ci    }
362d96309c9Sopenharmony_ci
363d96309c9Sopenharmony_ci    return len;
364d96309c9Sopenharmony_ci}
365d96309c9Sopenharmony_ci
366d96309c9Sopenharmony_ciint32 LogContentFmt(char *outStr, int32 outStrLen, const uint8 *pLogContent)
367d96309c9Sopenharmony_ci{
368d96309c9Sopenharmony_ci    int32 len;
369d96309c9Sopenharmony_ci    HiLogContent *logContentPtr = (HiLogContent *)pLogContent;
370d96309c9Sopenharmony_ci
371d96309c9Sopenharmony_ci    len = LogCommonFmt(outStr, outStrLen, &(logContentPtr->commonContent));
372d96309c9Sopenharmony_ci    boolean isHash = CHECK_HASH_FLAG(logContentPtr->commonContent.level);
373d96309c9Sopenharmony_ci    if (len >= 0) {
374d96309c9Sopenharmony_ci        if (isHash) {
375d96309c9Sopenharmony_ci            len += LogValuesFmtHash(outStr + len, outStrLen - len, logContentPtr);
376d96309c9Sopenharmony_ci        } else if (GETOPTION(g_hiviewConfig.outputOption) == OUTPUT_OPTION_DEBUG) {
377d96309c9Sopenharmony_ci            len += LogDebugValuesFmt(outStr + len, outStrLen - len, logContentPtr);
378d96309c9Sopenharmony_ci        } else {
379d96309c9Sopenharmony_ci            len += LogValuesFmt(outStr + len, outStrLen - len, logContentPtr);
380d96309c9Sopenharmony_ci        }
381d96309c9Sopenharmony_ci    }
382d96309c9Sopenharmony_ci
383d96309c9Sopenharmony_ci    if (len < 0) {
384d96309c9Sopenharmony_ci        return len;
385d96309c9Sopenharmony_ci    }
386d96309c9Sopenharmony_ci
387d96309c9Sopenharmony_ci    if (len >= outStrLen - 1) {
388d96309c9Sopenharmony_ci        outStr[outStrLen - TAIL_LINE_BREAK] = '\n';
389d96309c9Sopenharmony_ci        outStr[outStrLen - 1] = '\0';
390d96309c9Sopenharmony_ci    } else {
391d96309c9Sopenharmony_ci        outStr[len++] = '\n';
392d96309c9Sopenharmony_ci        outStr[len++] = '\0';
393d96309c9Sopenharmony_ci    }
394d96309c9Sopenharmony_ci
395d96309c9Sopenharmony_ci    return len;
396d96309c9Sopenharmony_ci}
397d96309c9Sopenharmony_ci
398d96309c9Sopenharmony_cistatic int32 LogCommonFmt(char *outStr, int32 outStrLen, const HiLogCommon *commonContentPtr)
399d96309c9Sopenharmony_ci{
400d96309c9Sopenharmony_ci    int32 ret;
401d96309c9Sopenharmony_ci    time_t time;
402d96309c9Sopenharmony_ci    uint32 month, day, hour, min, sec;
403d96309c9Sopenharmony_ci    uint8_t level;
404d96309c9Sopenharmony_ci    struct tm nowTime = {0};
405d96309c9Sopenharmony_ci
406d96309c9Sopenharmony_ci    time = commonContentPtr->time;
407d96309c9Sopenharmony_ci    localtime_r(&time, &nowTime);
408d96309c9Sopenharmony_ci    month = nowTime.tm_mon + 1;
409d96309c9Sopenharmony_ci    day = nowTime.tm_mday;
410d96309c9Sopenharmony_ci    hour = nowTime.tm_hour;
411d96309c9Sopenharmony_ci    min = nowTime.tm_min;
412d96309c9Sopenharmony_ci    sec = nowTime.tm_sec;
413d96309c9Sopenharmony_ci    level = CLEAR_HASH_FLAG(commonContentPtr->level);
414d96309c9Sopenharmony_ci    if (level >= HILOG_LV_MAX) {
415d96309c9Sopenharmony_ci        level = 0;
416d96309c9Sopenharmony_ci    }
417d96309c9Sopenharmony_ci    ret = snprintf_s(outStr, outStrLen, outStrLen - 1, "%02d-%02d %02d:%02d:%02d.%03d 0 %d %c %d/%s: ",
418d96309c9Sopenharmony_ci        month, day, hour, min, sec, commonContentPtr->milli, commonContentPtr->task, g_logLevelInfo[level],
419d96309c9Sopenharmony_ci        commonContentPtr->module, HiLogGetModuleName(commonContentPtr->module));
420d96309c9Sopenharmony_ci
421d96309c9Sopenharmony_ci    return ret;
422d96309c9Sopenharmony_ci}
423d96309c9Sopenharmony_ci
424d96309c9Sopenharmony_cistatic int32 LogValuesFmt(char *desStrPtr, int32 desLen, const HiLogContent *logContentPtr)
425d96309c9Sopenharmony_ci{
426d96309c9Sopenharmony_ci    int32 i;
427d96309c9Sopenharmony_ci    int32 outLen = 0;
428d96309c9Sopenharmony_ci    int32 len;
429d96309c9Sopenharmony_ci    char fmtStr[SINGLE_FMT_MAX_LEN];
430d96309c9Sopenharmony_ci    uint32 valNum = logContentPtr->commonContent.valueNumber;
431d96309c9Sopenharmony_ci    const char *fmt = logContentPtr->commonContent.fmt;
432d96309c9Sopenharmony_ci    uint32 valueIndex = 0;
433d96309c9Sopenharmony_ci    for (i = 0; fmt[i] != 0 && outLen < desLen;) {
434d96309c9Sopenharmony_ci        if (fmt[i] != '%') {
435d96309c9Sopenharmony_ci            desStrPtr[outLen++] = fmt[i++];
436d96309c9Sopenharmony_ci            continue;
437d96309c9Sopenharmony_ci        }
438d96309c9Sopenharmony_ci        if (fmt[i + 1] == '%') {
439d96309c9Sopenharmony_ci            desStrPtr[outLen++] = fmt[i++];
440d96309c9Sopenharmony_ci            desStrPtr[outLen++] = fmt[i++];
441d96309c9Sopenharmony_ci            continue;
442d96309c9Sopenharmony_ci        }
443d96309c9Sopenharmony_ci        fmtStr[0] = fmt[i++];
444d96309c9Sopenharmony_ci        uint32 t = 1;
445d96309c9Sopenharmony_ci        while (fmt[i] != 0 && t < sizeof(fmtStr) - 1) {
446d96309c9Sopenharmony_ci            /* %s %ms %-ms %m.ns %-m.ns convert to %p */
447d96309c9Sopenharmony_ci            if ((fmt[i] == 's' || fmt[i] == 'S') &&
448d96309c9Sopenharmony_ci                (fmt[i - 1] == '%' || (fmt[i - 1] >= '0' && fmt[i - 1] <= '9'))) {
449d96309c9Sopenharmony_ci                fmtStr[1] = 'p';
450d96309c9Sopenharmony_ci                fmtStr[FMT_CONVERT_TRMINATOR] = 0;
451d96309c9Sopenharmony_ci                i++;
452d96309c9Sopenharmony_ci                break;
453d96309c9Sopenharmony_ci            }
454d96309c9Sopenharmony_ci            if ((fmt[i] >= 'a' && fmt[i] <= 'z') || (fmt[i] >= 'A' && fmt[i] <= 'Z')) {
455d96309c9Sopenharmony_ci                fmtStr[t++] = fmt[i++];
456d96309c9Sopenharmony_ci                fmtStr[t] = 0;
457d96309c9Sopenharmony_ci                break;
458d96309c9Sopenharmony_ci            }
459d96309c9Sopenharmony_ci            fmtStr[t++] = fmt[i++];
460d96309c9Sopenharmony_ci        }
461d96309c9Sopenharmony_ci        if (valueIndex < valNum) {
462d96309c9Sopenharmony_ci            len = snprintf_s(&desStrPtr[outLen], desLen - outLen, desLen - outLen - 1,
463d96309c9Sopenharmony_ci                fmtStr, logContentPtr->values[valueIndex]);
464d96309c9Sopenharmony_ci            if (len < 0) {
465d96309c9Sopenharmony_ci                break;
466d96309c9Sopenharmony_ci            }
467d96309c9Sopenharmony_ci            outLen += len;
468d96309c9Sopenharmony_ci            valueIndex++;
469d96309c9Sopenharmony_ci        }
470d96309c9Sopenharmony_ci    }
471d96309c9Sopenharmony_ci
472d96309c9Sopenharmony_ci    return outLen;
473d96309c9Sopenharmony_ci}
474d96309c9Sopenharmony_ci
475d96309c9Sopenharmony_cistatic void RemovePrivacyFmt(const char* fmtStr, size_t fmtLen, char* arr, size_t arrLen)
476d96309c9Sopenharmony_ci{
477d96309c9Sopenharmony_ci    static const char *publicStr = "{public}";
478d96309c9Sopenharmony_ci    static const char *privateStr = "{private}";
479d96309c9Sopenharmony_ci    static const int publicLen = 8;
480d96309c9Sopenharmony_ci    static const int privateLen = 9;
481d96309c9Sopenharmony_ci    size_t writePos = 0;
482d96309c9Sopenharmony_ci    size_t pos = 0;
483d96309c9Sopenharmony_ci    for (; pos < fmtLen; ++pos) {
484d96309c9Sopenharmony_ci        arr[writePos++] = fmtStr[pos];
485d96309c9Sopenharmony_ci        if (fmtStr[pos] != '%') {
486d96309c9Sopenharmony_ci            continue;
487d96309c9Sopenharmony_ci        }
488d96309c9Sopenharmony_ci        if (pos + 1 + publicLen < fmtLen && strncmp(fmtStr + pos + 1, publicStr, publicLen) == 0) {
489d96309c9Sopenharmony_ci            pos += publicLen;
490d96309c9Sopenharmony_ci        } else if (pos + 1 + privateLen < fmtLen && strncmp(fmtStr + pos + 1, privateStr, privateLen) == 0) {
491d96309c9Sopenharmony_ci            pos += privateLen;
492d96309c9Sopenharmony_ci        }
493d96309c9Sopenharmony_ci    }
494d96309c9Sopenharmony_ci    while (pos < fmtLen) {
495d96309c9Sopenharmony_ci        arr[writePos++] = fmtStr[pos];
496d96309c9Sopenharmony_ci    }
497d96309c9Sopenharmony_ci    arr[writePos] = 0;
498d96309c9Sopenharmony_ci    return;
499d96309c9Sopenharmony_ci}
500d96309c9Sopenharmony_ci
501d96309c9Sopenharmony_cistatic int32 LogDebugValuesFmt(char *desStrPtr, int32 desLen, const HiLogContent *logContentPtr)
502d96309c9Sopenharmony_ci{
503d96309c9Sopenharmony_ci    int32 ret = 0;
504d96309c9Sopenharmony_ci    size_t fmtLen = strlen(logContentPtr->commonContent.fmt);
505d96309c9Sopenharmony_ci    char *fmt = (char *)malloc((fmtLen + 1) * sizeof(char)); // 1: for '\0'
506d96309c9Sopenharmony_ci    if (fmt == NULL) {
507d96309c9Sopenharmony_ci        return -1;
508d96309c9Sopenharmony_ci    }
509d96309c9Sopenharmony_ci    memset_s(fmt, fmtLen + 1, 0, fmtLen + 1);
510d96309c9Sopenharmony_ci    RemovePrivacyFmt(logContentPtr->commonContent.fmt, fmtLen, fmt, fmtLen);
511d96309c9Sopenharmony_ci    switch (logContentPtr->commonContent.valueNumber) {
512d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_0:
513d96309c9Sopenharmony_ci            ret = strncpy_s(desStrPtr, desLen, fmt, desLen - 1);
514d96309c9Sopenharmony_ci            if (ret != EOK) {
515d96309c9Sopenharmony_ci                ret = -1;
516d96309c9Sopenharmony_ci            } else {
517d96309c9Sopenharmony_ci                ret = strlen(fmt);
518d96309c9Sopenharmony_ci            }
519d96309c9Sopenharmony_ci            break;
520d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_1:
521d96309c9Sopenharmony_ci            ret = snprintf_s(desStrPtr, desLen, desLen - 1, fmt,
522d96309c9Sopenharmony_ci                logContentPtr->values[0]);
523d96309c9Sopenharmony_ci            break;
524d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_2:
525d96309c9Sopenharmony_ci            ret = snprintf_s(desStrPtr, desLen, desLen - 1, fmt,
526d96309c9Sopenharmony_ci                logContentPtr->values[0], logContentPtr->values[1]);
527d96309c9Sopenharmony_ci            break;
528d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_3:
529d96309c9Sopenharmony_ci            ret = snprintf_s(desStrPtr, desLen, desLen - 1, fmt,
530d96309c9Sopenharmony_ci                logContentPtr->values[0], logContentPtr->values[1], logContentPtr->values[LOG_MULTI_PARA_2]);
531d96309c9Sopenharmony_ci            break;
532d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_4:
533d96309c9Sopenharmony_ci            ret = snprintf_s(desStrPtr, desLen, desLen - 1, fmt,
534d96309c9Sopenharmony_ci                logContentPtr->values[0], logContentPtr->values[1], logContentPtr->values[LOG_MULTI_PARA_2],
535d96309c9Sopenharmony_ci                logContentPtr->values[LOG_MULTI_PARA_3]);
536d96309c9Sopenharmony_ci            break;
537d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_5:
538d96309c9Sopenharmony_ci            ret = snprintf_s(desStrPtr, desLen, desLen - 1, fmt,
539d96309c9Sopenharmony_ci                logContentPtr->values[0], logContentPtr->values[1], logContentPtr->values[LOG_MULTI_PARA_2],
540d96309c9Sopenharmony_ci                logContentPtr->values[LOG_MULTI_PARA_3], logContentPtr->values[LOG_MULTI_PARA_4]);
541d96309c9Sopenharmony_ci            break;
542d96309c9Sopenharmony_ci        case LOG_MULTI_PARA_MAX:
543d96309c9Sopenharmony_ci            ret = snprintf_s(desStrPtr, desLen, desLen - 1, fmt,
544d96309c9Sopenharmony_ci                logContentPtr->values[0], logContentPtr->values[1], logContentPtr->values[LOG_MULTI_PARA_2],
545d96309c9Sopenharmony_ci                logContentPtr->values[LOG_MULTI_PARA_3], logContentPtr->values[LOG_MULTI_PARA_4],
546d96309c9Sopenharmony_ci                logContentPtr->values[LOG_MULTI_PARA_5]);
547d96309c9Sopenharmony_ci            break;
548d96309c9Sopenharmony_ci        default:
549d96309c9Sopenharmony_ci            break;
550d96309c9Sopenharmony_ci    }
551d96309c9Sopenharmony_ci    free(fmt);
552d96309c9Sopenharmony_ci    return (ret < 0) ? (desLen - 1) : ret;
553d96309c9Sopenharmony_ci}
554d96309c9Sopenharmony_ci
555d96309c9Sopenharmony_cistatic int32 IntAppendStr(char* str, int32 num, char end)
556d96309c9Sopenharmony_ci{
557d96309c9Sopenharmony_ci    int32 digits = 0;
558d96309c9Sopenharmony_ci    if (num == 0) {
559d96309c9Sopenharmony_ci        str[0] = '0';
560d96309c9Sopenharmony_ci        digits++;
561d96309c9Sopenharmony_ci        str[1] = end;
562d96309c9Sopenharmony_ci        return digits + 1;
563d96309c9Sopenharmony_ci    }
564d96309c9Sopenharmony_ci    int32 temp = num > 0 ? num : -num;
565d96309c9Sopenharmony_ci    while (temp > 0) {
566d96309c9Sopenharmony_ci        temp /= INI_CONVERT_DIVID_NUM;
567d96309c9Sopenharmony_ci        digits++;
568d96309c9Sopenharmony_ci    }
569d96309c9Sopenharmony_ci    if (num < 0) {
570d96309c9Sopenharmony_ci        str[0] = '-';
571d96309c9Sopenharmony_ci        temp = -num;
572d96309c9Sopenharmony_ci        str++;
573d96309c9Sopenharmony_ci    } else {
574d96309c9Sopenharmony_ci        temp = num;
575d96309c9Sopenharmony_ci    }
576d96309c9Sopenharmony_ci    for (int32 i = digits - 1; i >= 0; i--) {
577d96309c9Sopenharmony_ci        str[i] = temp % INI_CONVERT_DIVID_NUM + '0';
578d96309c9Sopenharmony_ci        temp /= INI_CONVERT_DIVID_NUM;
579d96309c9Sopenharmony_ci    }
580d96309c9Sopenharmony_ci    str[digits] = end;
581d96309c9Sopenharmony_ci    if (num < 0) {
582d96309c9Sopenharmony_ci        digits ++;
583d96309c9Sopenharmony_ci    }
584d96309c9Sopenharmony_ci    return digits + 1;
585d96309c9Sopenharmony_ci}
586d96309c9Sopenharmony_ci
587d96309c9Sopenharmony_cistatic int UIntAppendStr(char* str, uint32 num, char end)
588d96309c9Sopenharmony_ci{
589d96309c9Sopenharmony_ci    int32 digits = 0;
590d96309c9Sopenharmony_ci    if (num == 0) {
591d96309c9Sopenharmony_ci        str[0] = '0';
592d96309c9Sopenharmony_ci        digits++;
593d96309c9Sopenharmony_ci        str[1] = end;
594d96309c9Sopenharmony_ci        return digits + 1;
595d96309c9Sopenharmony_ci    }
596d96309c9Sopenharmony_ci    uint32 temp = num;
597d96309c9Sopenharmony_ci    while (temp > 0) {
598d96309c9Sopenharmony_ci        temp /= INI_CONVERT_DIVID_NUM;
599d96309c9Sopenharmony_ci        digits++;
600d96309c9Sopenharmony_ci    }
601d96309c9Sopenharmony_ci    temp = num;
602d96309c9Sopenharmony_ci    for (int32 i = digits - 1; i >= 0; i--) {
603d96309c9Sopenharmony_ci        str[i] = temp % INI_CONVERT_DIVID_NUM + '0';
604d96309c9Sopenharmony_ci        temp /= INI_CONVERT_DIVID_NUM;
605d96309c9Sopenharmony_ci    }
606d96309c9Sopenharmony_ci    str[digits] = end;
607d96309c9Sopenharmony_ci    return digits + 1;
608d96309c9Sopenharmony_ci}
609d96309c9Sopenharmony_ci
610d96309c9Sopenharmony_cistatic int32 LogValuesFmtHash(char *desStrPtr, int32 desLen, const HiLogContent *logContentPtr)
611d96309c9Sopenharmony_ci{
612d96309c9Sopenharmony_ci    int32 outLen = 0;
613d96309c9Sopenharmony_ci    uint32 paraNum = logContentPtr->commonContent.valueNumber;
614d96309c9Sopenharmony_ci    int32 ret = strncpy_s(&desStrPtr[outLen], desLen - outLen, "hash:", strlen("hash:"));
615d96309c9Sopenharmony_ci    if (ret != 0) {
616d96309c9Sopenharmony_ci        return -ret;
617d96309c9Sopenharmony_ci    }
618d96309c9Sopenharmony_ci    outLen += strlen("hash:");
619d96309c9Sopenharmony_ci    int32 len = UIntAppendStr(&desStrPtr[outLen], (uint32)logContentPtr->commonContent.fmt, ' ');
620d96309c9Sopenharmony_ci    outLen += len;
621d96309c9Sopenharmony_ci    ret = strncpy_s(&desStrPtr[outLen], desLen - outLen, "para:", strlen("para:"));
622d96309c9Sopenharmony_ci    if (ret != 0) {
623d96309c9Sopenharmony_ci        return -ret;
624d96309c9Sopenharmony_ci    }
625d96309c9Sopenharmony_ci    outLen += strlen("para:");
626d96309c9Sopenharmony_ci    for (uint32 i = 0; i < paraNum && i < LOG_MULTI_PARA_MAX; i++) {
627d96309c9Sopenharmony_ci        len = IntAppendStr(&desStrPtr[outLen], (int32)logContentPtr->values[i], ' ');
628d96309c9Sopenharmony_ci        outLen += len;
629d96309c9Sopenharmony_ci    }
630d96309c9Sopenharmony_ci    return outLen;
631d96309c9Sopenharmony_ci}
632d96309c9Sopenharmony_ci
633d96309c9Sopenharmony_civoid FlushLog(boolean syncFlag)
634d96309c9Sopenharmony_ci{
635d96309c9Sopenharmony_ci    int8 opt = GETOPTION(g_hiviewConfig.outputOption);
636d96309c9Sopenharmony_ci    if (g_logCache.usedSize > 0) {
637d96309c9Sopenharmony_ci        if (syncFlag == FALSE) {
638d96309c9Sopenharmony_ci            switch (opt) {
639d96309c9Sopenharmony_ci                case OUTPUT_OPTION_TEXT_FILE:
640d96309c9Sopenharmony_ci                    HiviewSendMessage(HIVIEW_SERVICE, HIVIEW_MSG_OUTPUT_LOG_TEXT_FILE, SYNC_FILE);
641d96309c9Sopenharmony_ci                    break;
642d96309c9Sopenharmony_ci                case OUTPUT_OPTION_BIN_FILE:
643d96309c9Sopenharmony_ci                    HiviewSendMessage(HIVIEW_SERVICE, HIVIEW_MSG_OUTPUT_LOG_BIN_FILE, SYNC_FILE);
644d96309c9Sopenharmony_ci                    break;
645d96309c9Sopenharmony_ci                case OUTPUT_OPTION_FLOW:
646d96309c9Sopenharmony_ci                    HiviewSendMessage(HIVIEW_SERVICE, HIVIEW_MSG_OUTPUT_LOG_FLOW, SYNC_FILE);
647d96309c9Sopenharmony_ci                    break;
648d96309c9Sopenharmony_ci                default:
649d96309c9Sopenharmony_ci                    break;
650d96309c9Sopenharmony_ci            }
651d96309c9Sopenharmony_ci        } else {
652d96309c9Sopenharmony_ci            Request request = {0};
653d96309c9Sopenharmony_ci            request.msgValue = SYNC_FILE;
654d96309c9Sopenharmony_ci            switch (opt) {
655d96309c9Sopenharmony_ci                case OUTPUT_OPTION_TEXT_FILE:
656d96309c9Sopenharmony_ci                    OutputLog2TextFile(&request);
657d96309c9Sopenharmony_ci                    break;
658d96309c9Sopenharmony_ci                case OUTPUT_OPTION_BIN_FILE:
659d96309c9Sopenharmony_ci                    OutputLog2BinFile(&request);
660d96309c9Sopenharmony_ci                    break;
661d96309c9Sopenharmony_ci                case OUTPUT_OPTION_FLOW:
662d96309c9Sopenharmony_ci                    OutputLogRealtime(NULL);
663d96309c9Sopenharmony_ci                    break;
664d96309c9Sopenharmony_ci                default:
665d96309c9Sopenharmony_ci                    break;
666d96309c9Sopenharmony_ci            }
667d96309c9Sopenharmony_ci        }
668d96309c9Sopenharmony_ci    }
669d96309c9Sopenharmony_ci}
670d96309c9Sopenharmony_ci
671d96309c9Sopenharmony_civoid HiviewRegisterHilogProc(HilogProc func)
672d96309c9Sopenharmony_ci{
673d96309c9Sopenharmony_ci    g_hilogOutputProc = func;
674d96309c9Sopenharmony_ci}
675d96309c9Sopenharmony_ci
676d96309c9Sopenharmony_ciuint32 HiviewGetConfigOption(void)
677d96309c9Sopenharmony_ci{
678d96309c9Sopenharmony_ci    return GETOPTION(g_hiviewConfig.outputOption);
679d96309c9Sopenharmony_ci}
680d96309c9Sopenharmony_ci
681d96309c9Sopenharmony_civoid HiviewUnRegisterHilogProc(HilogProc func)
682d96309c9Sopenharmony_ci{
683d96309c9Sopenharmony_ci    (void)func;
684d96309c9Sopenharmony_ci    if (g_hilogOutputProc != NULL) {
685d96309c9Sopenharmony_ci        g_hilogOutputProc = NULL;
686d96309c9Sopenharmony_ci    }
687d96309c9Sopenharmony_ci}
688d96309c9Sopenharmony_ci
689d96309c9Sopenharmony_civoid HiviewRegisterHiLogFileWatcher(FileProc func, const char *path)
690d96309c9Sopenharmony_ci{
691d96309c9Sopenharmony_ci    if (func == NULL) {
692d96309c9Sopenharmony_ci        return;
693d96309c9Sopenharmony_ci    }
694d96309c9Sopenharmony_ci    RegisterFileWatcher(&g_logFile, func, path);
695d96309c9Sopenharmony_ci}
696d96309c9Sopenharmony_ci
697d96309c9Sopenharmony_civoid HiviewUnRegisterHiLogFileWatcher(FileProc func)
698d96309c9Sopenharmony_ci{
699d96309c9Sopenharmony_ci    if (func == NULL) {
700d96309c9Sopenharmony_ci        return;
701d96309c9Sopenharmony_ci    }
702d96309c9Sopenharmony_ci    UnRegisterFileWatcher(&g_logFile, func);
703d96309c9Sopenharmony_ci}
704d96309c9Sopenharmony_ci
705d96309c9Sopenharmony_ciint HiLogFileProcImp(const char* dest, uint8 mode)
706d96309c9Sopenharmony_ci{
707d96309c9Sopenharmony_ci    FlushLog(TRUE);
708d96309c9Sopenharmony_ci    HIVIEW_MutexLock(g_logFlushInfo.mutex);
709d96309c9Sopenharmony_ci    int ret = ProcFile(&g_logFile, dest, (FileProcMode)mode);
710d96309c9Sopenharmony_ci    HIVIEW_MutexUnlock(g_logFlushInfo.mutex);
711d96309c9Sopenharmony_ci    return ret;
712d96309c9Sopenharmony_ci}
713d96309c9Sopenharmony_ci
714d96309c9Sopenharmony_civoid HiLogOutputFileLockImp(void)
715d96309c9Sopenharmony_ci{
716d96309c9Sopenharmony_ci    HIVIEW_MutexLock(g_outputLogInfo.mutex);
717d96309c9Sopenharmony_ci}
718d96309c9Sopenharmony_ci
719d96309c9Sopenharmony_civoid HiLogOutputFileUnLockImp(void)
720d96309c9Sopenharmony_ci{
721d96309c9Sopenharmony_ci    HIVIEW_MutexUnlock(g_outputLogInfo.mutex);
722d96309c9Sopenharmony_ci}
723