diff --git a/adapter/properties.cpp b/adapter/properties.cpp index aa62ef483b0bb446b931b43c241a76dbbb27dc1e..f810db3a76ca22f7e469f9f1a442553757003633 100644 --- a/adapter/properties.cpp +++ b/adapter/properties.cpp @@ -103,14 +103,14 @@ public: if (m_commit == 0) { // temparary solution, after sysparam supply get_global_commitid, FIXME return m_defaultValue; } - auto handle = FindParameter(m_key.c_str()); + int handle = static_cast(FindParameter(m_key.c_str())); if (handle == -1) { m_commit = 0; // temparary solution, after sysparam supply get_global_commitid, FIXME return m_defaultValue; } m_handle = handle; } - auto currentCommit = GetParameterCommitId(m_handle); + int currentCommit = static_cast(GetParameterCommitId(m_handle)); PropertyTypeLocker locker(m_propType); if (locker.isLocked()) { if (currentCommit != m_commit) { @@ -153,8 +153,8 @@ private: } RawPropertyData m_rawData = {0}; - unsigned int m_handle = -1; - unsigned int m_commit = -1; + int m_handle = -1; + int m_commit = -1; T m_value; const T m_defaultValue; const uint32_t m_propType; @@ -173,7 +173,7 @@ void PropertyGet(const string &key, char *value, int len) return; } - auto handle = FindParameter(key.c_str()); + int handle = static_cast(FindParameter(key.c_str())); if (handle == -1) { return; } @@ -189,7 +189,7 @@ void PropertySet(const string &key, const char* value) { auto len = value ? strlen(value) : 0; if (len > HILOG_PROP_VALUE_MAX) { - std::cerr << "PropertyGet(): len exceed maximum.\n"; + std::cerr << "PropertySet(): len exceed maximum.\n"; return; } @@ -198,7 +198,7 @@ void PropertySet(const string &key, const char* value) if (result == EC_INVALID) { std::cerr << "PropertySet(): Invalid arguments.\n"; } else { - std::cerr << "PropertySet(): Error: " << result << "\n"; + std::cerr << "PropertySet(): key: " << key.c_str() << "value: " << value << "Error: " << result << "\n"; } } } @@ -243,6 +243,8 @@ string GetPropertyName(uint32_t propType) case PROP_PERSIST_DEBUG: key = "persist.sys.hilog.debug.on"; break; + case PROP_BUFFER_SIZE: + key = "hilog.buffersize."; default: break; } @@ -435,3 +437,40 @@ uint16_t GetTagLevel(const string& tag) LogLevelCache* levelCache = it->second; return levelCache->getValue(); } + +static string GetBufferSizePropName(uint16_t type, bool persist) +{ + string name = persist ? "persist.sys." : ""; + + static const string logTypeStr[LOG_TYPE_MAX + 1] = { + "app", "init", "", "core", "kmsg", "global" + }; + name += GetPropertyName(PROP_BUFFER_SIZE) + logTypeStr[type]; + return name; +} + +size_t GetBufferSize(uint16_t type, bool persist) +{ + char value[HILOG_PROP_VALUE_MAX] = {0}; + + if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) { + return 0; + } + + PropertyGet(GetBufferSizePropName(type, persist), value, HILOG_PROP_VALUE_MAX); + if (value[0] == 0) { + return 0; + } + + return std::stoi(value); +} + +void SetBufferSize(uint16_t type, bool persist, size_t size) +{ + if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) { + return; + } + + PropertySet(GetBufferSizePropName(type, persist), to_string(size).c_str()); + return; +} \ No newline at end of file diff --git a/adapter/properties.h b/adapter/properties.h index 12d2e5d075fa3a7e1266b492f081dd91ed400bd6..3c01da3c1a4ea70acd4615ea968701e36f3cec1e 100644 --- a/adapter/properties.h +++ b/adapter/properties.h @@ -32,6 +32,7 @@ using PropType = enum { PROP_SINGLE_DEBUG, PROP_KMSG, PROP_PERSIST_DEBUG, + PROP_BUFFER_SIZE, }; std::string GetPropertyName(uint32_t propType); @@ -48,5 +49,6 @@ bool IsDomainSwitchOn(); bool IsKmsgSwitchOn(); uint16_t GetGlobalLevel(); uint16_t GetDomainLevel(uint32_t domain); - +size_t GetBufferSize(uint16_t type, bool persist); +void SetBufferSize(uint16_t type, bool persist, size_t size); #endif diff --git a/frameworks/native/include/hilog_common.h b/frameworks/native/include/hilog_common.h index 5b387bde51c739e873dad93684e8d225cd9079c2..9b9158ed80513b3d39c6afd4e97ffe9e9d9c379b 100644 --- a/frameworks/native/include/hilog_common.h +++ b/frameworks/native/include/hilog_common.h @@ -50,7 +50,8 @@ const long long NSEC = 1000000000LL; const long long US = 1000000LL; const long long NS2US = 1000LL; const long long NS2MS = 1000000LL; -const uint32_t MAX_BUFFER_SIZE = 1UL<<30; +const size_t MIN_BUFFER_SIZE = 65536; +const size_t MAX_BUFFER_SIZE = 1UL<<30; const uint32_t MAX_PERSISTER_BUFFER_SIZE = 64 * 1024; constexpr int MIN_LOG_FILE_NUM = 2; constexpr int MAX_LOG_FILE_NUM = 1000; diff --git a/services/hilogd/etc/hilog.para b/services/hilogd/etc/hilog.para old mode 100755 new mode 100644 index 6d5560306987d8dbbb777f8c0468fd51e55acb8a..16301b238d88974a1000a874de835dde2460556a --- a/services/hilogd/etc/hilog.para +++ b/services/hilogd/etc/hilog.para @@ -20,3 +20,4 @@ hilog.flowctrl.pid.on=false hilog.flowctrl.domain.on=false hilog.loggable.global=d +hilog.buffersize.global=262144 \ No newline at end of file diff --git a/services/hilogd/etc/hilogd.cfg b/services/hilogd/etc/hilogd.cfg index 0cd5bd306a6c03495889c5eb143168355a410280..032464a48a69e144d0e51366c5347f0df13c2e9f 100644 --- a/services/hilogd/etc/hilogd.cfg +++ b/services/hilogd/etc/hilogd.cfg @@ -8,7 +8,8 @@ "name" : "services:hilogd", "cmds" : [ "mkdir /data/log/ 0770 system log", - "mkdir /data/log/hilog/ 0750 logd log" + "mkdir /data/log/hilog/ 0750 logd log", + "setparam hilog.buffersize.global 262144" ] } ], diff --git a/services/hilogd/include/log_buffer.h b/services/hilogd/include/log_buffer.h index 46919c14b8e5865ac56e73c3bee24237489559b3..02e7f23c3cfc2b6fca9956de3e782973746a08df 100644 --- a/services/hilogd/include/log_buffer.h +++ b/services/hilogd/include/log_buffer.h @@ -44,6 +44,8 @@ public: void RemoveBufReader(const ReaderId& id); int32_t Delete(uint16_t logType); + + void InitBuffLen(); int64_t GetBuffLen(uint16_t logType); int32_t SetBuffLen(uint16_t logType, uint64_t buffSize); int32_t GetStatisticInfoByLog(uint16_t logType, uint64_t& printLen, uint64_t& cacheLen, int32_t& dropped); diff --git a/services/hilogd/log_buffer.cpp b/services/hilogd/log_buffer.cpp index 4b38c1fed06f7772f7043c9fe74dba47bb73514b..337852ec3267892ab0e6f243ddcb7033146811ff 100644 --- a/services/hilogd/log_buffer.cpp +++ b/services/hilogd/log_buffer.cpp @@ -20,12 +20,12 @@ #include "hilog_common.h" #include "flow_control_init.h" #include "log_time_stamp.h" +#include "properties.h" namespace OHOS { namespace HiviewDFX { using namespace std; -const float DROP_RATIO = 0.05; -static size_t g_maxBufferSize = 4194304; +static const float DROP_RATIO = 0.05; static size_t g_maxBufferSizeByType[LOG_TYPE_MAX] = {262144, 262144, 262144, 262144, 262144}; const int DOMAIN_STRICT_MASK = 0xd000000; const int DOMAIN_FUZZY_MASK = 0xdffff; @@ -40,6 +40,7 @@ HilogBuffer::HilogBuffer() printLenByType[i] = 0; droppedByType[i] = 0; } + InitBuffLen(); } HilogBuffer::~HilogBuffer() {} @@ -230,6 +231,20 @@ std::shared_ptr HilogBuffer::GetReader(const ReaderId return std::shared_ptr(); } +void HilogBuffer::InitBuffLen() +{ + size_t global_size = GetBufferSize(LOG_TYPE_MAX, false); + size_t persist_global_size = GetBufferSize(LOG_TYPE_MAX, true); + for (int i = 0; i < LOG_TYPE_MAX; i++) { + size_t size = GetBufferSize(i, false); + size_t persist_size = GetBufferSize(i, true); + SetBuffLen(i, global_size); + SetBuffLen(i, persist_global_size); + SetBuffLen(i, size); + SetBuffLen(i, persist_size); + } +} + int64_t HilogBuffer::GetBuffLen(uint16_t logType) { if (logType >= LOG_TYPE_MAX) { @@ -244,11 +259,11 @@ int32_t HilogBuffer::SetBuffLen(uint16_t logType, uint64_t buffSize) if (logType >= LOG_TYPE_MAX) { return ERR_LOG_TYPE_INVALID; } - if (buffSize <= 0 || buffSize > MAX_BUFFER_SIZE) { + if (buffSize < MIN_BUFFER_SIZE || buffSize > MAX_BUFFER_SIZE) { return ERR_BUFF_SIZE_INVALID; } + std::unique_lock lock(hilogBufferMutex); g_maxBufferSizeByType[logType] = buffSize; - g_maxBufferSize += (buffSize - sizeByType[logType]); return buffSize; } diff --git a/services/hilogd/main.cpp b/services/hilogd/main.cpp index 3dc165fa258ca7ef2f212eeaef7f3d77245f7cc3..cfdf8aa509f54c61a11932d811d3023b4e6862f4 100644 --- a/services/hilogd/main.cpp +++ b/services/hilogd/main.cpp @@ -185,10 +185,13 @@ int HilogdEntry() auto startupCheckTask = std::async(std::launch::async, [&hilogBuffer]() { prctl(PR_SET_NAME, "hilogd.pst_res"); if (WaitingToDo(WAITING_DATA_MS, HILOG_FILE_DIR, WaitingDataMounted) == 0) { + hilogBuffer.InitBuffLen(); RestorePersistJobs(hilogBuffer); } }); + auto kmsgTask = std::async(std::launch::async, [&hilogBuffer]() { + prctl(PR_SET_NAME, "hilogd.rd_kmsg"); LogKmsg logKmsg(hilogBuffer); logKmsg.ReadAllKmsg(); }); diff --git a/services/hilogtool/log_controller.cpp b/services/hilogtool/log_controller.cpp index 9addb78b1cf8f31d75f4f42ed93e016fbd257e0c..b913f1607dae1d6f9368286e4178f862e80d750d 100644 --- a/services/hilogtool/log_controller.cpp +++ b/services/hilogtool/log_controller.cpp @@ -85,7 +85,7 @@ uint16_t GetLogType(const string& logTypeStr) } else if (logTypeStr == "kmsg") { logType = LOG_KMSG; } else { - return 0xffff; + logType = LOG_TYPE_MAX; } return logType; } @@ -272,7 +272,7 @@ int32_t BufferSizeOp(SeqPacketSocketClient& controller, uint8_t msgCmd, const st } for (iter = 0; iter < logTypeNum; iter++) { pBuffSizeMsg->logType = GetLogType(vecLogType[iter]); - if (pBuffSizeMsg->logType == 0xffff) { + if (pBuffSizeMsg->logType == LOG_TYPE_MAX) { cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } @@ -291,7 +291,7 @@ int32_t BufferSizeOp(SeqPacketSocketClient& controller, uint8_t msgCmd, const st } for (iter = 0; iter < logTypeNum; iter++) { pBuffResizeMsg->logType = GetLogType(vecLogType[iter]); - if (pBuffResizeMsg->logType == 0xffff) { + if (pBuffResizeMsg->logType == LOG_TYPE_MAX) { cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } @@ -319,7 +319,7 @@ int32_t StatisticInfoOp(SeqPacketSocketClient& controller, uint8_t msgCmd, uint32_t domain; if (domainStr == "") { domain = 0xffffffff; - if (logType == 0xffff) { + if (logType == LOG_TYPE_MAX) { cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } @@ -374,7 +374,7 @@ int32_t LogClearOp(SeqPacketSocketClient& controller, uint8_t msgCmd, const std: } for (iter = 0; iter < logTypeNum; iter++) { pLogClearMsg->logType = GetLogType(vecLogType[iter]); - if (pLogClearMsg->logType == 0xffff) { + if (pLogClearMsg->logType == LOG_TYPE_MAX) { cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } @@ -412,7 +412,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) { + if (tmpType == LOG_TYPE_MAX) { cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } @@ -479,7 +479,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) { + if (tmpType == LOG_TYPE_MAX) { cout << ParseErrorCode(ERR_LOG_TYPE_INVALID) << endl; return RET_FAIL; } diff --git a/services/hilogtool/log_display.cpp b/services/hilogtool/log_display.cpp index 4e0a76a95536cd6350f047537d632efbcd6a3175..bae34023dcf059bfbb8fdd4e591502c5adbc83a7 100644 --- a/services/hilogtool/log_display.cpp +++ b/services/hilogtool/log_display.cpp @@ -22,6 +22,7 @@ #include "hilog/log.h" #include "format.h" #include "log_controller.h" +#include "properties.h" #include "log_display.h" namespace OHOS { @@ -224,6 +225,7 @@ int32_t ControlCmdResult(const char* message) outputStr += " buffer size is "; outputStr += GetByteLenStr(pBuffResizeRst->buffSize); outputStr += "\n"; + SetBufferSize((LogType)pBuffResizeRst->logType, true, (size_t)pBuffResizeRst->buffSize); } pBuffResizeRst++; resultLen += sizeof(BuffSizeResult);