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