diff --git a/frameworks/native/include/hilog_common.h b/frameworks/native/include/hilog_common.h index f1e8269c59c6751bd6f97551f85f2cb9a8c9fbf0..e87596b1c31cc2098ec02a03bcc62f04628318e4 100644 --- a/frameworks/native/include/hilog_common.h +++ b/frameworks/native/include/hilog_common.h @@ -32,7 +32,6 @@ #define SENDIDN 0 // hilogd: reached end of log; hilogtool: exit log reading #define SENDIDA 1 // hilogd & hilogtool: normal log reading #define SENDIDS 2 // hilogd: notify for new data; hilogtool: block and wait for new data -#define MULARGS 5 #define MAX_LOG_LEN 1024 /* maximum length of a log, include '\0' */ #define MAX_TAG_LEN 32 /* log tag size, include '\0' */ #define MAX_DOMAINS 5 @@ -46,7 +45,9 @@ #define ONE_GB (1UL<<30) #define ONE_TB (1ULL<<40) -#define DOMAIN_NUMBER_BASE (16) +const uint32_t MAX_BUFFER_SIZE = 1UL<<30; +const uint32_t MAX_PERSISTER_BUFFER_SIZE = 64 * 1024; +const int MSG_MAX_LEN = 2048; /* * header of log message from libhilog to hilogd @@ -83,4 +84,42 @@ using HilogShowFormatBuffer = struct { #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) + +/* + * ******************************************** + * Error codes list + * Error codes _values_ are pinned down. + * ******************************************** +*/ +typedef enum { + ERR_LOG_LEVEL_INVALID = -2, + ERR_LOG_TYPE_INVALID = -3, + ERR_QUERY_LEVEL_INVALID = -4, + ERR_QUERY_DOMAIN_INVALID = -5, + ERR_QUERY_TAG_INVALID = -6, + ERR_QUERY_PID_INVALID = -7, + ERR_QUERY_TYPE_INVALID = -8, + ERR_BUFF_SIZE_INVALID = -8, + ERR_BUFF_SIZE_EXP = -9, + ERR_LOG_CONTENT_NULL = -10, + ERR_LOG_PERSIST_FILE_SIZE_INVALID = -11, + ERR_LOG_PERSIST_FILE_NAME_INVALID = -12, + ERR_LOG_PERSIST_COMPRESS_BUFFER_EXP = -13, + ERR_LOG_PERSIST_DIR_OPEN_FAIL = -14, + ERR_LOG_PERSIST_COMPRESS_INIT_FAIL = -15, + ERR_LOG_PERSIST_FILE_OPEN_FAIL = -16, + ERR_LOG_PERSIST_MMAP_FAIL = -17, + ERR_LOG_PERSIST_JOBID_FAIL = -18, + ERR_DOMAIN_INVALID = -19, + ERR_MEM_ALLOC_FAIL = -20, + ERR_MSG_LEN_INVALID = -21, + ERR_PRIVATE_SWITCH_VALUE_INVALID = -22, + ERR_COMMAND_NOT_FOUND = -23, + ERR_FORMAT_INVALID = -24, + ERR_LOG_PERSIST_FILE_PATH_INVALID = -25, + ERR_PERSIST_INFO_OPEN_FAIL = -26, + ERR_FLOWCONTROL_CONF_OPEN_FAIL = -27, + ERR_LOG_PERSIST_JOBID_INVALID = -28, + ERR_FLOWCTRL_SWITCH_VALUE_INVALID = -29, +} ErrorCode; #endif /* HILOG_COMMON_H */ diff --git a/services/hilogd/flow_control_init.cpp b/services/hilogd/flow_control_init.cpp index 1b7729302d9cedd3bb0d687d520ddfdc537eb62d..5f4f47e7f02190ee3c5f53289c69a093cf97498c 100644 --- a/services/hilogd/flow_control_init.cpp +++ b/services/hilogd/flow_control_init.cpp @@ -145,7 +145,7 @@ int32_t InitDomainFlowCtrl() #ifdef DEBUG std::cout << "open file failed" << std::endl; #endif - return -1; + return ERR_FLOWCONTROL_CONF_OPEN_FAIL; } std::string line; while (!ifs.eof()) { diff --git a/services/hilogd/include/log_compress.h b/services/hilogd/include/log_compress.h index eafcce6c34b4e5cb2bd3caaff10e80451ec285ac..b2ed40a49b991d73564c0f595628ac1326923278 100644 --- a/services/hilogd/include/log_compress.h +++ b/services/hilogd/include/log_compress.h @@ -15,6 +15,7 @@ #ifndef HILOG_COMPRESS_H #define HILOG_COMPRESS_H +#include "hilog_common.h" #include #ifdef USING_ZSTD_COMPRESS #define ZSTD_STATIC_LINKING_ONLY @@ -24,7 +25,6 @@ #include namespace OHOS { namespace HiviewDFX { -const uint32_t MAX_PERSISTER_BUFFER_SIZE = 64 * 1024; typedef struct { uint32_t offset; char content[MAX_PERSISTER_BUFFER_SIZE]; diff --git a/services/hilogd/log_buffer.cpp b/services/hilogd/log_buffer.cpp index e3a3e287f0c7d6a0f22cea311822f4fad2fdacee..fd975f02b249b436e8aeb2268829951fa4427311 100644 --- a/services/hilogd/log_buffer.cpp +++ b/services/hilogd/log_buffer.cpp @@ -31,7 +31,6 @@ namespace OHOS { namespace HiviewDFX { using namespace std; -#define MAX_BUFFER_SIZE 4194304 const float DROP_RATIO = 0.05; static int g_maxBufferSize = 4194304; static int g_maxBufferSizeByType[LOG_TYPE_MAX] = {1048576, 1048576, 1048576, 1048576}; @@ -181,6 +180,9 @@ bool HilogBuffer::Query(std::shared_ptr reader) size_t HilogBuffer::Delete(uint16_t logType) { + if (logType >= LOG_TYPE_MAX) { + return ERR_LOG_TYPE_INVALID; + } size_t sum = 0; hilogBufferMutex.lock(); std::list::iterator it = hilogDataList.begin(); @@ -233,7 +235,7 @@ bool HilogBuffer::Query(LogReader* reader) size_t HilogBuffer::GetBuffLen(uint16_t logType) { if (logType >= LOG_TYPE_MAX) { - return -1; + return ERR_LOG_TYPE_INVALID; } uint64_t buffSize = g_maxBufferSizeByType[logType]; return buffSize; @@ -241,8 +243,11 @@ size_t HilogBuffer::GetBuffLen(uint16_t logType) size_t HilogBuffer::SetBuffLen(uint16_t logType, uint64_t buffSize) { - if (logType >= LOG_TYPE_MAX || buffSize <= 0 || buffSize > ONE_GB) { - return -1; + if (logType >= LOG_TYPE_MAX) { + return ERR_LOG_TYPE_INVALID; + } + if (buffSize <= 0 || buffSize > MAX_BUFFER_SIZE) { + return ERR_BUFF_SIZE_INVALID; } hilogBufferMutex.lock(); if (sizeByType[logType] > buffSize) { @@ -270,7 +275,7 @@ size_t HilogBuffer::SetBuffLen(uint16_t logType, uint64_t buffSize) } // Re-confirm if enough elements has been removed if (sizeByType[logType] > (size_t)g_maxBufferSizeByType[logType] || size > (size_t)g_maxBufferSize) { - return -1; + return ERR_BUFF_SIZE_EXP; } g_maxBufferSizeByType[logType] = buffSize; g_maxBufferSize += (buffSize - sizeByType[logType]); @@ -285,7 +290,7 @@ size_t HilogBuffer::SetBuffLen(uint16_t logType, uint64_t buffSize) int32_t HilogBuffer::GetStatisticInfoByLog(uint16_t logType, uint64_t& printLen, uint64_t& cacheLen, int32_t& dropped) { if (logType >= LOG_TYPE_MAX) { - return -1; + return ERR_LOG_TYPE_INVALID; } printLen = printLenByType[logType]; cacheLen = cacheLenByType[logType]; @@ -305,7 +310,7 @@ int32_t HilogBuffer::GetStatisticInfoByDomain(uint32_t domain, uint64_t& printLe int32_t HilogBuffer::ClearStatisticInfoByLog(uint16_t logType) { if (logType >= LOG_TYPE_MAX) { - return -1; + return ERR_LOG_TYPE_INVALID; } ClearDroppedByType(); printLenByType[logType] = 0; diff --git a/services/hilogd/log_persister.cpp b/services/hilogd/log_persister.cpp index d656e06a0885e12f0cd97843faad45a6a8d55fbd..056e64c40dc250570bab4a2e0d65c594daf1e233 100644 --- a/services/hilogd/log_persister.cpp +++ b/services/hilogd/log_persister.cpp @@ -96,7 +96,7 @@ int LogPersister::Init() { int nPos = path.find_last_of('/'); if (nPos == RET_FAIL) { - return RET_FAIL; + return ERR_LOG_PERSIST_FILE_PATH_INVALID; } mmapPath = path.substr(0, nPos) + "/." + ANXILLARY_FILE_NAME + to_string(id); if (access(path.substr(0, nPos).c_str(), F_OK) != 0) { @@ -113,10 +113,10 @@ int LogPersister::Init() break; } if (hit) { - return RET_FAIL; + return ERR_LOG_PERSIST_FILE_PATH_INVALID; } if (InitCompress() == RET_FAIL) { - return RET_FAIL; + return ERR_LOG_PERSIST_COMPRESS_INIT_FAIL; } fd = open(mmapPath.c_str(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); if (fd <= 0) { @@ -135,7 +135,7 @@ int LogPersister::Init() #ifdef DEBUG cout << "open log file(" << mmapPath << ") failed: " << strerror(errno) << endl; #endif - return RET_FAIL; + return ERR_LOG_PERSIST_FILE_OPEN_FAIL; } fdinfo = fopen((mmapPath + ".info").c_str(), "a+"); if (fdinfo == nullptr) { @@ -143,7 +143,7 @@ int LogPersister::Init() cout << "open loginfo file failed: " << strerror(errno) << endl; #endif close(fd); - return RET_FAIL; + return ERR_LOG_PERSIST_FILE_OPEN_FAIL; } buffer = (LogPersisterBuffer *)mmap(nullptr, sizeof(LogPersisterBuffer), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); @@ -153,7 +153,7 @@ int LogPersister::Init() cout << "mmap file failed: " << strerror(errno) << endl; #endif fclose(fdinfo); - return RET_FAIL; + return ERR_LOG_PERSIST_MMAP_FAIL; } if (restore == true) { #ifdef DEBUG @@ -266,7 +266,7 @@ int LogPersister::WriteData(HilogData *data) return 0; if (compressor->Compress(buffer, compressBuffer) != 0) { cout << "COMPRESS Error" << endl; - return -1; + return RET_FAIL; }; WriteFile(); return writeUnCompressedBuffer(data) ? 0 : -1; @@ -374,7 +374,7 @@ int LogPersister::Kill(const uint32_t id) ++it; } } - return found ? 0 : -1; + return found ? 0 : ERR_LOG_PERSIST_JOBID_FAIL; } bool LogPersister::isExited() @@ -420,7 +420,7 @@ int LogPersister::SaveInfo(LogPersistStartMsg& pMsg) info.levels = queryCondition.levels; if (strcpy_s(info.msg.filePath, FILE_PATH_MAX_LEN, pMsg.filePath) != 0) { cout << "Failed to save persister file path" << endl; - return RET_FAIL; + return ERR_LOG_PERSIST_FILE_PATH_INVALID; } cout << "Saved Path=" << info.msg.filePath << endl; return RET_SUCCESS; diff --git a/services/hilogd/log_persister_rotator.cpp b/services/hilogd/log_persister_rotator.cpp index 61db2e217fc02c554f30895d98b1685a240c6249..48f2df743a974f8f7131ff717a998bdacb9855ff 100644 --- a/services/hilogd/log_persister_rotator.cpp +++ b/services/hilogd/log_persister_rotator.cpp @@ -49,7 +49,7 @@ int LogPersisterRotator::Init() } } fdinfo = fopen((mmapPath + ".info").c_str(), "r+"); - if (fdinfo == nullptr) return RET_FAIL; + if (fdinfo == nullptr) return ERR_PERSIST_INFO_OPEN_FAIL; return RET_SUCCESS; } @@ -57,7 +57,7 @@ int LogPersisterRotator::Input(const char *buf, uint32_t length) { cout << __func__ << " " << fileName << " " << index << " " << length << " need: " << needRotate << endl; - if (length <= 0 || buf == nullptr) return -1; + if (length <= 0 || buf == nullptr) return ERR_LOG_PERSIST_COMPRESS_BUFFER_EXP; if (needRotate) { output.close(); Rotate(); @@ -127,4 +127,4 @@ void LogPersisterRotator::SetId(uint32_t pId) id = pId; } } // namespace HiviewDFX -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/hilogd/log_querier.cpp b/services/hilogd/log_querier.cpp index 94c4041f457a7b9c5ae1a68547d4d9d47c952b9f..24ec6b782d36691faefabaa8760211909a3755fe 100644 --- a/services/hilogd/log_querier.cpp +++ b/services/hilogd/log_querier.cpp @@ -111,10 +111,16 @@ void HandlePersistStartRequest(char* reqMsg, std::shared_ptr logReade if (pLogPersistStartRst == nullptr) { return; } + if (pLogPersistStartMsg->jobId <= 0) { + pLogPersistStartRst->result = ERR_LOG_PERSIST_JOBID_INVALID; + SetMsgHead(&pLogPersistStartRsp->msgHeader, MC_RSP_LOG_PERSIST_START, sendMsgLen); + logReader->hilogtoolConnectSocket->Write(msgToSend, sendMsgLen + sizeof(MessageHeader)); + return; + } if (pLogPersistStartMsg->fileSize < MAX_PERSISTER_BUFFER_SIZE) { std::cout << "Persist log file size less than min size" << std::endl; pLogPersistStartRst->jobId = pLogPersistStartMsg->jobId; - pLogPersistStartRst->result = RET_FAIL; + pLogPersistStartRst->result = ERR_LOG_PERSIST_FILE_SIZE_INVALID; SetMsgHead(&pLogPersistStartRsp->msgHeader, MC_RSP_LOG_PERSIST_START, sendMsgLen); logReader->hilogtoolConnectSocket->Write(msgToSend, sendMsgLen + sizeof(MessageHeader)); return; @@ -126,7 +132,7 @@ void HandlePersistStartRequest(char* reqMsg, std::shared_ptr logReade } else { cout << "FileName is not valid!" << endl; pLogPersistStartRst->jobId = pLogPersistStartMsg->jobId; - pLogPersistStartRst->result = RET_FAIL; + pLogPersistStartRst->result = ERR_LOG_PERSIST_FILE_NAME_INVALID; SetMsgHead(&pLogPersistStartRsp->msgHeader, MC_RSP_LOG_PERSIST_START, sendMsgLen); logReader->hilogtoolConnectSocket->Write(msgToSend, sendMsgLen + sizeof(MessageHeader)); return; @@ -146,7 +152,7 @@ void HandlePersistStartRequest(char* reqMsg, std::shared_ptr logReade pLogPersistStartRst->jobId = pLogPersistStartMsg->jobId; pLogPersistStartRst->result = persister->Init(); int rotatorRes = rotator->Init(); - if (pLogPersistStartRst->result == RET_FAIL || saveInfoRes == RET_FAIL || rotatorRes == RET_FAIL) { + if (pLogPersistStartRst->result != 0 || saveInfoRes != 0 || rotatorRes != 0) { cout << "LogPersister failed to initialize!" << endl; persister.reset(); } else { @@ -185,7 +191,7 @@ void HandlePersistDeleteRequest(char* reqMsg, std::shared_ptr logRead rst = LogPersister::Kill(pLogPersistStopMsg->jobId); if (pLogPersistStopRst) { pLogPersistStopRst->jobId = pLogPersistStopMsg->jobId; - pLogPersistStopRst->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pLogPersistStopRst->result = (rst < 0) ? rst : RET_SUCCESS; pLogPersistStopRst++; msgNum++; } @@ -194,7 +200,7 @@ void HandlePersistDeleteRequest(char* reqMsg, std::shared_ptr logRead rst = LogPersister::Kill((*it).jobId); if (pLogPersistStopRst) { pLogPersistStopRst->jobId = (*it).jobId; - pLogPersistStopRst->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pLogPersistStopRst->result = (rst < 0) ? rst : RET_SUCCESS; pLogPersistStopRst++; msgNum++; } @@ -233,7 +239,7 @@ void HandlePersistQueryRequest(char* reqMsg, std::shared_ptr logReade rst = LogPersister::Query(pLogPersistQueryMsg->logType, resultList); for (it = resultList.begin(); it != resultList.end(); ++it) { if (pLogPersistQueryRst) { - pLogPersistQueryRst->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pLogPersistQueryRst->result = (rst < 0) ? rst : RET_SUCCESS; pLogPersistQueryRst->jobId = (*it).jobId; pLogPersistQueryRst->logType = (*it).logType; pLogPersistQueryRst->compressAlg = (*it).compressAlg; @@ -280,7 +286,7 @@ void HandleBufferResizeRequest(char* reqMsg, std::shared_ptr logReade if (pBuffResizeRst) { pBuffResizeRst->logType = pBuffResizeMsg->logType; pBuffResizeRst->buffSize = pBuffResizeMsg->buffSize; - pBuffResizeRst->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pBuffResizeRst->result = (rst < 0) ? rst : RET_SUCCESS; pBuffResizeRst++; } pBuffResizeMsg++; @@ -315,7 +321,7 @@ void HandleBufferSizeRequest(char* reqMsg, std::shared_ptr logReader, if (pBuffSizeRst) { pBuffSizeRst->logType = pBuffSizeMsg->logType; pBuffSizeRst->buffSize = buffLen; - pBuffSizeRst->result = (buffLen < 0) ? RET_FAIL : RET_SUCCESS; + pBuffSizeRst->result = (buffLen < 0) ? buffLen : RET_SUCCESS; pBuffSizeRst++; } recvMsgLen += sizeof(BuffSizeMsg); @@ -340,13 +346,13 @@ void HandleInfoQueryRequest(char* reqMsg, std::shared_ptr logReader, pStatisticInfoQueryRsp->domain = pStatisticInfoQueryReq->domain; rst = buffer->GetStatisticInfoByLog(pStatisticInfoQueryReq->logType, pStatisticInfoQueryRsp->printLen, pStatisticInfoQueryRsp->cacheLen, pStatisticInfoQueryRsp->dropped); - pStatisticInfoQueryRsp->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pStatisticInfoQueryRsp->result = (rst < 0) ? rst : RET_SUCCESS; } else { pStatisticInfoQueryRsp->logType = pStatisticInfoQueryReq->logType; pStatisticInfoQueryRsp->domain = pStatisticInfoQueryReq->domain; rst = buffer->GetStatisticInfoByDomain(pStatisticInfoQueryReq->domain, pStatisticInfoQueryRsp->printLen, pStatisticInfoQueryRsp->cacheLen, pStatisticInfoQueryRsp->dropped); - pStatisticInfoQueryRsp->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pStatisticInfoQueryRsp->result = (rst < 0) ? rst : RET_SUCCESS; } SetMsgHead(&pStatisticInfoQueryRsp->msgHeader, MC_RSP_STATISTIC_INFO_QUERY, sizeof(StatisticInfoQueryResponse) - sizeof(MessageHeader)); @@ -364,12 +370,12 @@ void HandleInfoClearRequest(char* reqMsg, std::shared_ptr logReader, pStatisticInfoClearRsp->logType = pStatisticInfoClearReq->logType; pStatisticInfoClearRsp->domain = pStatisticInfoClearReq->domain; rst = buffer->ClearStatisticInfoByLog(pStatisticInfoClearReq->logType); - pStatisticInfoClearRsp->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pStatisticInfoClearRsp->result = (rst < 0) ? rst : RET_SUCCESS; } else { pStatisticInfoClearRsp->logType = pStatisticInfoClearReq->logType; pStatisticInfoClearRsp->domain = pStatisticInfoClearReq->domain; rst = buffer->ClearStatisticInfoByDomain(pStatisticInfoClearReq->domain); - pStatisticInfoClearRsp->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pStatisticInfoClearRsp->result = (rst < 0) ? rst : RET_SUCCESS; } SetMsgHead(&pStatisticInfoClearRsp->msgHeader, MC_RSP_STATISTIC_INFO_CLEAR, sizeof(StatisticInfoClearResponse) - sizeof(MessageHeader)); @@ -396,7 +402,7 @@ void HandleBufferClearRequest(char* reqMsg, std::shared_ptr logReader rst = buffer->Delete(pLogClearMsg->logType); if (pLogClearRst) { pLogClearRst->logType = pLogClearMsg->logType; - pLogClearRst->result = (rst < 0) ? RET_FAIL : RET_SUCCESS; + pLogClearRst->result = (rst < 0) ? rst : RET_SUCCESS; pLogClearRst++; } pLogClearMsg++; @@ -605,7 +611,7 @@ int LogQuerier::RestorePersistJobs(HilogBuffer& _buffer) int rotatorRes = rotator->Init(); persister->queryCondition.types = info.types; persister->queryCondition.levels = info.levels; - if (persisterRes == RET_FAIL || rotatorRes == RET_FAIL) { + if (persisterRes != 0 || rotatorRes != 0) { cout << "LogPersister failed to initialize!" << endl; persister.reset(); } else { @@ -617,7 +623,7 @@ int LogQuerier::RestorePersistJobs(HilogBuffer& _buffer) closedir (dir); } else { perror ("Failed to open persister directory!"); - return EXIT_FAILURE; + return ERR_LOG_PERSIST_DIR_OPEN_FAIL; } cout << "Finished restoring persist jobs!" << endl; return EXIT_SUCCESS; diff --git a/services/hilogtool/include/hilogtool.h b/services/hilogtool/include/hilogtool.h index 67fa9e982c062c4d5c59d1a5f5f776204b4b60aa..aea36bbaf70db75348dbdc8bf302ccf2f05b156f 100644 --- a/services/hilogtool/include/hilogtool.h +++ b/services/hilogtool/include/hilogtool.h @@ -17,6 +17,8 @@ namespace OHOS { namespace HiviewDFX { +#define DOMAIN_NUMBER_BASE (16) +#define DOMAIN_MAX_SCOPE 0xDFFFFFF typedef struct { uint16_t noBlockMode; uint8_t nPid; diff --git a/services/hilogtool/include/log_controller.h b/services/hilogtool/include/log_controller.h index 2030eac95e9073b91117bcaf9622ecb625694a62..e097aaef9f405bb28a49d9b861ce408aff6aaff1 100644 --- a/services/hilogtool/include/log_controller.h +++ b/services/hilogtool/include/log_controller.h @@ -27,7 +27,6 @@ namespace OHOS { namespace HiviewDFX { constexpr int RECV_BUF_LEN = MAX_LOG_LEN * 2; - void SetMsgHead(MessageHeader* msgHeader, const uint8_t msgCmd, const uint16_t msgLen); int MultiQuerySplit(const std::string& src, const char& delim, std::vector& vec); inline void PrintBuffer(void* pBuff, unsigned int nLen); diff --git a/services/hilogtool/include/log_display.h b/services/hilogtool/include/log_display.h index 4d1ffe34afab509f6ab8cf6253e9eeff6318a2af..2f0a40285c4830347c83185a7d27ffbb1b9bfbf0 100644 --- a/services/hilogtool/include/log_display.h +++ b/services/hilogtool/include/log_display.h @@ -24,7 +24,7 @@ namespace OHOS { namespace HiviewDFX { using namespace std; int32_t ControlCmdResult(const char* message); - +std::string ParseErrorCode(ErrorCode errorCode); void HilogShowLog(HilogShowFormat showFormat, HilogDataMessage* contentOut, HilogArgs* context, vector& tailBuffer); HilogShowFormat HilogFormat (const char* formatArg); diff --git a/services/hilogtool/log_controller.cpp b/services/hilogtool/log_controller.cpp index 6bcd3bc8b1aba668887d533426b28dc191f77c8c..1da81edd8a04f0456bfdaed2682946987fe7c4c4 100644 --- a/services/hilogtool/log_controller.cpp +++ b/services/hilogtool/log_controller.cpp @@ -34,10 +34,10 @@ namespace OHOS { namespace HiviewDFX { using namespace std; -const int MSG_MAX_LEN = 2048; const int LOG_PERSIST_FILE_SIZE = 4 * ONE_MB; const int LOG_PERSIST_FILE_NUM = 10; const uint32_t DEFAULT_JOBID = 1; + void SetMsgHead(MessageHeader* msgHeader, const uint8_t msgCmd, const uint16_t msgLen) { if (!msgHeader) { @@ -273,6 +273,7 @@ int32_t BufferSizeOp(SeqPacketSocketClient& controller, uint8_t msgCmd, std::str for (iter = 0; iter < logTypeNum; iter++) { pBuffSizeMsg->logType = GetLogType(vecLogType[iter]); if (pBuffSizeMsg->logType == 0xffff) { + cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } pBuffSizeMsg++; @@ -291,6 +292,7 @@ int32_t BufferSizeOp(SeqPacketSocketClient& controller, uint8_t msgCmd, std::str for (iter = 0; iter < logTypeNum; iter++) { pBuffResizeMsg->logType = GetLogType(vecLogType[iter]); if (pBuffResizeMsg->logType == 0xffff) { + cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } pBuffResizeMsg->buffSize = GetBuffSize(buffSizeStr); @@ -318,12 +320,13 @@ int32_t StatisticInfoOp(SeqPacketSocketClient& controller, uint8_t msgCmd, if (domainStr == "") { domain = 0xffffffff; if (logType == 0xffff) { + cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } } else { std::istringstream(domainStr) >> domain; - if (domain == 0) { - std::cout << "Invalid parameter" << std::endl; + if (domain == 0 || domain > DOMAIN_MAX_SCOPE) { + cout << ParseErrorCode(ERR_DOMAIN_INVALID) << endl; return RET_FAIL; } } @@ -362,14 +365,17 @@ int32_t LogClearOp(SeqPacketSocketClient& controller, uint8_t msgCmd, std::strin LogClearRequest* pLogClearReq = reinterpret_cast(msgToSend); LogClearMsg* pLogClearMsg = reinterpret_cast(&pLogClearReq->logClearMsg); if (!pLogClearMsg) { + cout << ParseErrorCode(ERR_MEM_ALLOC_FAIL) << endl; return RET_FAIL; } if (logTypeNum * sizeof(LogClearMsg) + sizeof(MessageHeader) > MSG_MAX_LEN) { + cout << ParseErrorCode(ERR_MSG_LEN_INVALID) << endl; return RET_FAIL; } for (iter = 0; iter < logTypeNum; iter++) { pLogClearMsg->logType = GetLogType(vecLogType[iter]); if (pLogClearMsg->logType == 0xffff) { + cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } pLogClearMsg++; @@ -401,17 +407,23 @@ int32_t LogPersistOp(SeqPacketSocketClient& controller, uint8_t msgCmd, LogPersi LogPersistStartMsg* pLogPersistStartMsg = reinterpret_cast(&pLogPersistStartReq->logPersistStartMsg); if (sizeof(LogPersistStartRequest) > MSG_MAX_LEN) { + cout << ParseErrorCode(ERR_MSG_LEN_INVALID) << endl; return RET_FAIL; } for (iter = 0; iter < logTypeNum; iter++) { uint16_t tmpType = GetLogType(vecLogType[iter]); if (tmpType == 0xffff) { + cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } pLogPersistStartMsg->logType = (0b01 << tmpType) | pLogPersistStartMsg->logType; } pLogPersistStartMsg->jobId = (logPersistParam->jobIdStr == "") ? DEFAULT_JOBID : stoi(logPersistParam->jobIdStr); + if (pLogPersistStartMsg->jobId <= 0) { + cout << ParseErrorCode(ERR_LOG_PERSIST_JOBID_INVALID) << endl; + return RET_FAIL; + } pLogPersistStartMsg->compressAlg = (logPersistParam->compressAlgStr == "") ? COMPRESS_TYPE_ZLIB : GetCompressAlg(logPersistParam->compressAlgStr); pLogPersistStartMsg->fileSize = (logPersistParam->fileSizeStr == "") ? fileSizeDefault : GetBuffSize( @@ -419,6 +431,7 @@ int32_t LogPersistOp(SeqPacketSocketClient& controller, uint8_t msgCmd, LogPersi pLogPersistStartMsg->fileNum = (logPersistParam->fileNumStr == "") ? fileNumDefault : stoi(logPersistParam->fileNumStr); if (logPersistParam->fileNameStr.size() > FILE_PATH_MAX_LEN) { + cout << ParseErrorCode(ERR_LOG_PERSIST_FILE_NAME_INVALID) << endl; return RET_FAIL; } if (logPersistParam->fileNameStr != " ") { @@ -440,6 +453,7 @@ int32_t LogPersistOp(SeqPacketSocketClient& controller, uint8_t msgCmd, LogPersi break; } if (jobIdNum * sizeof(LogPersistStopMsg) + sizeof(MessageHeader) > MSG_MAX_LEN) { + cout << ParseErrorCode(ERR_MSG_LEN_INVALID) << endl; return RET_FAIL; } for (iter = 0; iter < jobIdNum; iter++) { @@ -460,6 +474,7 @@ int32_t LogPersistOp(SeqPacketSocketClient& controller, uint8_t msgCmd, LogPersi for (iter = 0; iter < logTypeNum; iter++) { uint16_t tmpType = GetLogType(vecLogType[iter]); if (tmpType == 0xffff) { + cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } pLogPersistQueryMsg->logType = (0b01 << tmpType) | pLogPersistQueryMsg->logType; @@ -501,6 +516,7 @@ int32_t SetPropertiesOp(SeqPacketSocketClient& controller, uint8_t operationType PropertySet(key.c_str(), "false"); cout << "hilog private formatter is disabled" << endl; } else { + cout << ParseErrorCode(ERR_PRIVATE_SWITCH_VALUE_INVALID) << endl; return RET_FAIL; } break; @@ -554,6 +570,7 @@ int32_t SetPropertiesOp(SeqPacketSocketClient& controller, uint8_t operationType PropertySet(key.c_str(), "false"); cout << "flow control by domain is disabled" << endl; } else { + cout << ParseErrorCode(ERR_FLOWCTRL_SWITCH_VALUE_INVALID) << endl; return RET_FAIL; } break; diff --git a/services/hilogtool/log_display.cpp b/services/hilogtool/log_display.cpp index e79ba70baa211fdad75e8cf870adbfac6e14bceb..d48b96afed88be96b15ec00d8d92441f91f993c7 100644 --- a/services/hilogtool/log_display.cpp +++ b/services/hilogtool/log_display.cpp @@ -20,7 +20,7 @@ #include #include #include - +#include #include "hilog/log.h" #include "format.h" #include "log_controller.h" @@ -35,6 +35,49 @@ using hash_t = std::uint64_t; constexpr hash_t PRIME = 0x100000001B3ull; constexpr hash_t BASIS = 0xCBF29CE484222325ull; +unordered_map errorMsg +{ + {ERR_LOG_LEVEL_INVALID, "Invalid log level, the valid log levels include D/I/W/E/F"}, + {ERR_LOG_TYPE_INVALID, "Invalid log type, the valid log types include app/core/init"}, + {ERR_QUERY_TYPE_INVALID, "Query condition on both types and excluded types is undefined"}, + {ERR_QUERY_LEVEL_INVALID, "Query condition on both levels and excluded levels is undefined"}, + {ERR_QUERY_DOMAIN_INVALID, "Invalid domain format, a hexadecimal number is needed"}, + {ERR_QUERY_TAG_INVALID, "Query condition on both tags and excluded tags is undefined"}, + {ERR_QUERY_PID_INVALID, "Query condition on both pid and excluded pid is undefined"}, + {ERR_BUFF_SIZE_INVALID, "Invalid buffer size, buffer size should be more than 0 and less than " + + to_string(MAX_BUFFER_SIZE)}, + {ERR_BUFF_SIZE_EXP, "Buffer resize exception"}, + {ERR_LOG_PERSIST_FILE_SIZE_INVALID, "Invalid log persist file size, file size should be not less than " + + to_string(MAX_PERSISTER_BUFFER_SIZE)}, + {ERR_LOG_PERSIST_FILE_NAME_INVALID, "Invalid log persist file name, file name should notĀ containĀ [\\/:*?\"<>|]"}, + {ERR_LOG_PERSIST_COMPRESS_BUFFER_EXP, "Invalid Log persist compression buffer"}, + {ERR_LOG_PERSIST_FILE_PATH_INVALID, "Invalid persister file path"}, + {ERR_LOG_PERSIST_COMPRESS_INIT_FAIL, "Log persist compression initialization failed"}, + {ERR_LOG_PERSIST_FILE_OPEN_FAIL, "Log persist open file failed"}, + {ERR_LOG_PERSIST_MMAP_FAIL, "Log persist mmap failed"}, + {ERR_LOG_PERSIST_JOBID_FAIL, "Log persist jobid not exist"}, + {ERR_DOMAIN_INVALID, "Invalid domain, domain should not be more than 0 and less than " + + to_string(DOMAIN_MAX_SCOPE)}, + {ERR_MEM_ALLOC_FAIL, "Alloc memory failed"}, + {ERR_MSG_LEN_INVALID, "Invalid message length, message length should be not more than " + + to_string(MSG_MAX_LEN)}, + {ERR_PRIVATE_SWITCH_VALUE_INVALID, "Invalid private switch value, valid:on/off"}, + {ERR_FLOWCTRL_SWITCH_VALUE_INVALID, "Invalid flowcontrl switch value, valid:pidon/pidoff/domainon/domainoff"}, + {ERR_LOG_PERSIST_JOBID_INVALID, "Invalid jobid, jobid should be more than 0"}, + {ERR_LOG_CONTENT_NULL, "Log content NULL"}, + {ERR_COMMAND_NOT_FOUND, "Command not found"}, + {ERR_FORMAT_INVALID, "Invalid format parameter"} +}; + +string ParseErrorCode(ErrorCode errorCode) +{ + if (errorMsg.count(errorCode) == 0) { + cout << "ERR_CODE not exist" << endl; + } + string errorMsgStr = "[ERR_CODE:" + to_string(errorCode) + "], " + errorMsg[errorCode]; + return errorMsgStr; +} + hash_t Hash(char const *str) { hash_t ret {BASIS}; @@ -73,14 +116,15 @@ string GetOrigType(uint16_t shiftType) { string logType = ""; if (((1 << LOG_INIT) & shiftType) != 0) { - logType += "init"; + logType += "init,"; } if (((1 << LOG_CORE) & shiftType) != 0) { - logType += "core"; + logType += "core,"; } if (((1 << LOG_APP) & shiftType) != 0) { - logType += "app "; + logType += "app,"; } + logType.erase(logType.end() - 1); return logType; } @@ -141,9 +185,10 @@ int32_t ControlCmdResult(const char* message) } BuffSizeResult* pBuffSizeRst = (BuffSizeResult*)&pBuffSizeRsp->buffSizeRst; while (pBuffSizeRst && resultLen < msgLen) { - if (pBuffSizeRst->result == RET_FAIL) { + if (pBuffSizeRst->result < 0) { outputStr += GetLogTypeStr(pBuffSizeRst->logType); - outputStr += " buffer size fail"; + outputStr += " buffer size fail\n"; + outputStr += ParseErrorCode((ErrorCode)pBuffSizeRst->result); outputStr += "\n"; } else { outputStr += GetLogTypeStr(pBuffSizeRst->logType); @@ -163,9 +208,10 @@ int32_t ControlCmdResult(const char* message) } BuffResizeResult* pBuffResizeRst = (BuffResizeResult*)&pBuffResizeRsp->buffResizeRst; while (pBuffResizeRst && resultLen < msgLen) { - if (pBuffResizeRst->result == RET_FAIL) { + if (pBuffResizeRst->result < 0) { outputStr += GetLogTypeStr(pBuffResizeRst->logType); - outputStr += " buffer resize fail"; + outputStr += " buffer resize fail\n"; + outputStr += ParseErrorCode((ErrorCode)pBuffResizeRst->result); outputStr += "\n"; } else { outputStr += GetLogTypeStr(pBuffResizeRst->logType); @@ -201,9 +247,10 @@ int32_t ControlCmdResult(const char* message) outputStr += logOrDomain; outputStr += " dropped log lines is "; outputStr += GetByteLenStr(staInfoQueryRsp->dropped); - } else if (staInfoQueryRsp->result == RET_FAIL) { + } else if (staInfoQueryRsp->result < 0) { outputStr += logOrDomain; - outputStr += " statistic info query fail "; + outputStr += " statistic info query fail\n"; + outputStr += ParseErrorCode((ErrorCode)staInfoQueryRsp->result); } break; } @@ -221,9 +268,10 @@ int32_t ControlCmdResult(const char* message) if (staInfoClearRsp->result == RET_SUCCESS) { outputStr += logOrDomain; outputStr += " statistic info clear success "; - } else if (staInfoClearRsp->result == RET_FAIL) { + } else if (staInfoClearRsp->result < 0) { outputStr += logOrDomain; - outputStr += " statistic info clear fail "; + outputStr += " statistic info clear fail\n"; + outputStr += ParseErrorCode((ErrorCode)staInfoClearRsp->result); } break; } @@ -234,9 +282,10 @@ int32_t ControlCmdResult(const char* message) } LogClearResult* pLogClearRst = (LogClearResult*)&pLogClearRsp->logClearRst; while (pLogClearRst && resultLen < msgLen) { - if (pLogClearRst->result == RET_FAIL) { + if (pLogClearRst->result < 0) { outputStr += GetLogTypeStr(pLogClearRst->logType); - outputStr += " log clear fail"; + outputStr += " log clear fail\n"; + outputStr += ParseErrorCode((ErrorCode)pLogClearRst->result); outputStr += "\n"; } else { outputStr += GetLogTypeStr(pLogClearRst->logType); @@ -256,10 +305,11 @@ int32_t ControlCmdResult(const char* message) LogPersistStartResult* pLogPersistStartRst = (LogPersistStartResult*)&pLogPersistStartRsp->logPersistStartRst; while (pLogPersistStartRst && resultLen < msgLen) { - if (pLogPersistStartRst->result == RET_FAIL) { + if (pLogPersistStartRst->result < 0) { outputStr += "Persist task [jobid:"; outputStr += to_string(pLogPersistStartRst->jobId); outputStr += "] start failed\n"; + outputStr += ParseErrorCode((ErrorCode)pLogPersistStartRst->result); } else { outputStr += "Persist task [jobid:"; outputStr += to_string(pLogPersistStartRst->jobId); @@ -277,10 +327,11 @@ int32_t ControlCmdResult(const char* message) } LogPersistStopResult* pLogPersistStopRst = (LogPersistStopResult*)&pLogPersistStopRsp->logPersistStopRst; while (pLogPersistStopRst && resultLen < msgLen) { - if (pLogPersistStopRst->result == RET_FAIL) { + if (pLogPersistStopRst->result < 0) { outputStr += "Persist task [jobid:"; outputStr += to_string(pLogPersistStopRst->jobId); outputStr += "] stop failed\n"; + outputStr += ParseErrorCode((ErrorCode)pLogPersistStopRst->result); } else { outputStr += "Persist task [jobid:"; outputStr += to_string(pLogPersistStopRst->jobId); @@ -299,10 +350,11 @@ int32_t ControlCmdResult(const char* message) LogPersistQueryResult* pLogPersistQueryRst = (LogPersistQueryResult*)&pLogPersistQueryRsp->logPersistQueryRst; while (pLogPersistQueryRst && resultLen < msgLen) { - if (pLogPersistQueryRst->result == RET_FAIL) { + if (pLogPersistQueryRst->result < 0) { outputStr = "Persist task [logtype:"; outputStr += GetLogTypeStr(pLogPersistQueryRst->logType); outputStr += "] query failed\n"; + outputStr += ParseErrorCode((ErrorCode)pLogPersistQueryRst->result); } else { outputStr += to_string(pLogPersistQueryRst->jobId); outputStr += " "; @@ -362,7 +414,7 @@ HilogShowFormat HilogFormat (const char* formatArg) format = MONOTONIC_SHOWFORMAT; break; default: - cout << "Format Invalid parameter"<length == 0) { -#ifdef DEBUG - cout << "Log content null" << endl; -#endif + std::cout << ParseErrorCode(ERR_LOG_CONTENT_NULL) << endl; return; } diff --git a/services/hilogtool/main.cpp b/services/hilogtool/main.cpp index 1daf7782ada5d21926657a631adfe48d7db97294..1bf7d2c2d472f8f8b8b10b6c69d02d961e897d2b 100644 --- a/services/hilogtool/main.cpp +++ b/services/hilogtool/main.cpp @@ -128,7 +128,7 @@ static int GetTypes(HilogArgs context, const string& typesArgs, bool exclude = f } else if (typesArgs == "core") { types |= 1< v(sregex_token_iterator(domains.begin() + 1, domains.end(), delimiter, -1), sregex_token_iterator()); for (auto s: v) { + strtoul(s.c_str(), &endptr, DOMAIN_NUMBER_BASE); + if (*endptr != '\0') { + cout << ParseErrorCode(ERR_QUERY_DOMAIN_INVALID) << endl; + exit(RET_FAIL); + } context.noDomains[context.nNoDomain++] = s; } } else { vector v(sregex_token_iterator(domains.begin(), domains.end(), delimiter, -1), sregex_token_iterator()); for (auto s: v) { + strtoul(s.c_str(), &endptr, DOMAIN_NUMBER_BASE); + if (*endptr != '\0') { + cout << ParseErrorCode(ERR_QUERY_DOMAIN_INVALID) << endl; + exit(RET_FAIL); + } context.domains[context.nDomain++] = s; context.domainArgs += (s + " "); } @@ -394,8 +403,8 @@ int HilogEntry(int argc, char* argv[]) } } if (context.nTag != 0 && context.nNoTag != 0) { - std::cout << "Query condition on both tags and excluded tags is undefined." << std::endl; - std::cout << "Please remove tags or excluded tags condition, and try again." << std::endl; + cout << ParseErrorCode(ERR_QUERY_TAG_INVALID) << endl; + exit(RET_FAIL); } break; @@ -435,8 +444,7 @@ int HilogEntry(int argc, char* argv[]) } } if (context.nPid != 0 && context.nNoPid != 0) { - std::cout << "Query condition on both pid and excluded pid is undefined." << std::endl; - std::cout << "Please remove pid or excluded pid condition, and try again." << std::endl; + cout << ParseErrorCode(ERR_QUERY_PID_INVALID) << endl; exit(RET_FAIL); } break; @@ -444,7 +452,7 @@ int HilogEntry(int argc, char* argv[]) context.algorithmArgs = optarg; break; default: - cout << "Command not found\n"<< endl; + cout << ParseErrorCode(ERR_COMMAND_NOT_FOUND) << endl; exit(1); } } @@ -579,7 +587,6 @@ int HilogEntry(int argc, char* argv[]) LogQueryResponseOp(controller, recvBuffer, RECV_BUF_LEN, &context, showFormat); break; } - default: cout << "Invalid response from hilogd! response: " << msgHeader->msgType << endl; break;