• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <array>
16 #include <atomic>
17 #include <cassert>
18 #include <climits>
19 #include <cstdio>
20 #include <cstring>
21 #include <ctime>
22 #include <fstream>
23 #include <functional>
24 #include <iostream>
25 #include <pthread.h>
26 #include <shared_mutex>
27 #include <string>
28 #include <sys/uio.h>
29 #include <unistd.h>
30 #include <unordered_map>
31 
32 #include <parameter.h>
33 #include <sysparam_errno.h>
34 #include <hilog/log.h>
35 #include <hilog_common.h>
36 #include <log_utils.h>
37 
38 #include "properties.h"
39 
40 namespace OHOS {
41 namespace HiviewDFX {
42 using namespace std;
43 
44 enum class PropType {
45     // Below properties are used in HiLog API, which will be invoked frequently, so they should be cached
46     PROP_PRIVATE = 0,
47     PROP_ONCE_DEBUG,
48     PROP_PERSIST_DEBUG,
49     PROP_GLOBAL_LOG_LEVEL,
50     PROP_PERSIST_GLOBAL_LOG_LEVEL,
51     PROP_DOMAIN_LOG_LEVEL,
52     PROP_PERSIST_DOMAIN_LOG_LEVEL,
53     PROP_TAG_LOG_LEVEL,
54     PROP_PERSIST_TAG_LOG_LEVEL,
55     PROP_DOMAIN_FLOWCTRL,
56     PROP_PROCESS_FLOWCTRL,
57 
58     // Below properties needn't be cached, used in low frequency
59     PROP_KMSG,
60     PROP_BUFFER_SIZE,
61     PROP_PROC_QUOTA,
62     PROP_STATS_ENABLE,
63     PROP_STATS_TAG_ENABLE,
64     PROP_DOMAIN_QUOTA,
65 
66     PROP_MAX,
67 };
68 using ReadLock = shared_lock<shared_timed_mutex>;
69 using InsertLock = unique_lock<shared_timed_mutex>;
70 
71 static constexpr int HILOG_PROP_VALUE_MAX = 92;
72 static constexpr int DEFAULT_QUOTA = 51200;
73 static int LockByProp(PropType propType);
74 static void UnlockByProp(PropType propType);
75 
76 static pthread_mutex_t g_privateLock = PTHREAD_MUTEX_INITIALIZER;
77 static pthread_mutex_t g_onceDebugLock = PTHREAD_MUTEX_INITIALIZER;
78 static pthread_mutex_t g_persistDebugLock = PTHREAD_MUTEX_INITIALIZER;
79 static pthread_mutex_t g_globalLevelLock = PTHREAD_MUTEX_INITIALIZER;
80 static pthread_mutex_t g_persistGlobalLevelLock = PTHREAD_MUTEX_INITIALIZER;
81 static pthread_mutex_t g_domainLevelLock = PTHREAD_MUTEX_INITIALIZER;
82 static pthread_mutex_t g_persistDomainLevelLock = PTHREAD_MUTEX_INITIALIZER;
83 static pthread_mutex_t g_tagLevelLock = PTHREAD_MUTEX_INITIALIZER;
84 static pthread_mutex_t g_persistTagLevelLock = PTHREAD_MUTEX_INITIALIZER;
85 static pthread_mutex_t g_domainFlowLock = PTHREAD_MUTEX_INITIALIZER;
86 static pthread_mutex_t g_processFlowLock = PTHREAD_MUTEX_INITIALIZER;
87 static constexpr const char* HAP_DEBUGGABLE = "HAP_DEBUGGABLE";
88 
89 using PropRes = struct {
90     string name;
91     pthread_mutex_t* lock;
92 };
93 
94 static PropRes *g_propResources = nullptr;
InitProps()95 static __attribute__((constructor)) void InitProps()
96 {
97     g_propResources = new PropRes[static_cast<int>(PropType::PROP_MAX)]{
98         // Cached:
99         {"hilog.private.on", &g_privateLock}, // PROP_PRIVATE
100         {"hilog.debug.on", &g_onceDebugLock}, // PROP_ONCE_DEBUG
101         {"persist.sys.hilog.debug.on", &g_persistDebugLock}, // PROP_PERSIST_DEBUG
102         {"hilog.loggable.global", &g_globalLevelLock}, // PROP_GLOBAL_LOG_LEVEL
103         {"persist.sys.hilog.loggable.global", &g_persistGlobalLevelLock}, // PROP_PERSIST_GLOBAL_LOG_LEVEL
104         {"hilog.loggable.domain.", &g_domainLevelLock}, // PROP_DOMAIN_LOG_LEVEL
105         {"persist.sys.hilog.loggable.domain.", &g_persistDomainLevelLock}, // PROP_PERSIST_DOMAIN_LOG_LEVEL
106         {"hilog.loggable.tag.", &g_tagLevelLock}, // PROP_TAG_LOG_LEVEL
107         {"persist.sys.hilog.loggable.tag.", &g_persistTagLevelLock}, // PROP_PERSIST_TAG_LOG_LEVEL
108         {"hilog.flowctrl.domain.on", &g_domainFlowLock}, // PROP_DOMAIN_FLOWCTRL
109         {"hilog.flowctrl.proc.on", &g_processFlowLock}, // PROP_PROCESS_FLOWCTRL
110 
111         // Non cached:
112         {"persist.sys.hilog.kmsg.on", nullptr}, // PROP_KMSG,
113         {"hilog.buffersize.", nullptr}, // PROP_BUFFER_SIZE,
114         {"hilog.quota.proc.", nullptr}, // PROP_PROC_QUOTA
115         {"persist.sys.hilog.stats", nullptr}, // PROP_STATS_ENABLE,
116         {"persist.sys.hilog.stats.tag", nullptr}, // PROP_STATS_TAG_ENABLE,
117         {"hilog.quota.domain.", nullptr}, // DOMAIN_QUOTA
118     };
119 }
120 
GetPropertyName(PropType propType)121 static string GetPropertyName(PropType propType)
122 {
123     return g_propResources[static_cast<int>(propType)].name;
124 }
125 
LockByProp(PropType propType)126 static int LockByProp(PropType propType)
127 {
128     if (g_propResources[static_cast<int>(propType)].lock == nullptr) {
129         return -1;
130     }
131     return pthread_mutex_trylock(g_propResources[static_cast<int>(propType)].lock);
132 }
133 
UnlockByProp(PropType propType)134 static void UnlockByProp(PropType propType)
135 {
136     if (g_propResources[static_cast<int>(propType)].lock == nullptr) {
137         return;
138     }
139     pthread_mutex_unlock(g_propResources[static_cast<int>(propType)].lock);
140     return;
141 }
142 
PropertyGet(const string & key,char * value,int len)143 static int PropertyGet(const string &key, char *value, int len)
144 {
145     int handle = static_cast<int>(FindParameter(key.c_str()));
146     if (handle == -1) {
147         return RET_FAIL;
148     }
149 
150     auto res = GetParameterValue(handle, value, len);
151     if (res < 0) {
152         std::cerr << "PropertyGet() -> GetParameterValue -> Can't get value for key: " << key;
153         std::cerr << " handle: " << handle << " Result: " << res << "\n";
154         return RET_FAIL;
155     }
156     return RET_SUCCESS;
157 }
158 
PropertySet(const string & key,const string & value)159 static int PropertySet(const string &key, const string &value)
160 {
161     auto result = SetParameter(key.c_str(), value.c_str());
162     if (result < 0) {
163         if (result == EC_INVALID) {
164             std::cerr << "PropertySet(): Invalid arguments.\n";
165         } else {
166             std::cerr << "PropertySet(): key: " << key.c_str() << ", value: " << value <<
167             ",  error: " << result << "\n";
168         }
169         return RET_FAIL;
170     }
171     return RET_SUCCESS;
172 }
173 
174 class PropertyTypeLocker {
175 public:
PropertyTypeLocker(PropType propType)176     explicit PropertyTypeLocker(PropType propType) : m_propType(propType), m_isLocked(false)
177     {
178         m_isLocked = !LockByProp(m_propType);
179     }
180 
~PropertyTypeLocker()181     ~PropertyTypeLocker()
182     {
183         if (m_isLocked) {
184             UnlockByProp(m_propType);
185         }
186     }
187 
isLocked() const188     bool isLocked() const
189     {
190         return m_isLocked;
191     }
192 
193 private:
194     PropType m_propType;
195     bool m_isLocked;
196 };
197 
198 using RawPropertyData = std::array<char, HILOG_PROP_VALUE_MAX>;
199 
200 template<typename T>
201 class CacheData {
202 public:
203     using DataConverter = std::function<T(const RawPropertyData&, const T& defaultVal)>;
204 
CacheData(DataConverter converter,const T & defaultValue,PropType propType,const std::string & suffix="")205     CacheData(DataConverter converter, const T& defaultValue, PropType propType, const std::string& suffix = "")
206         : m_value(defaultValue), m_defaultValue(defaultValue), m_propType(propType), m_converter(converter)
207     {
208         m_key = GetPropertyName(m_propType) + suffix;
209     }
210 
getValue()211     T getValue()
212     {
213         long long sysCommitId = GetSystemCommitId();
214         if (sysCommitId == m_sysCommit) {
215             return m_value;
216         }
217         m_sysCommit = sysCommitId;
218         if (m_handle == -1) {
219             int handle = static_cast<int>(FindParameter(m_key.c_str()));
220             if (handle == -1) {
221                 return m_defaultValue;
222             }
223             m_handle = handle;
224         }
225         int currentCommit = static_cast<int>(GetParameterCommitId(m_handle));
226         PropertyTypeLocker locker(m_propType);
227         if (locker.isLocked()) {
228             if (currentCommit != m_commit) {
229                 updateValue();
230                 m_commit = currentCommit;
231             }
232             return m_value;
233         } else {
234             return getDirectValue();
235         }
236     }
237 
238 private:
getRawValue(char * value,unsigned int len)239     bool getRawValue(char *value, unsigned int len)
240     {
241         auto res = GetParameterValue(m_handle, value, len);
242         if (res < 0) {
243             std::cerr << "CacheData -> GetParameterValue -> Can't get value for key: " << m_key;
244             std::cerr << " handle: " << m_handle << " Result: " << res << "\n";
245             return false;
246         }
247         return true;
248     }
249 
getDirectValue()250     T getDirectValue()
251     {
252         RawPropertyData tempData;
253         if (!getRawValue(tempData.data(), tempData.size())) {
254             return m_defaultValue;
255         }
256         m_value = m_converter(tempData, m_defaultValue);
257         return m_value;
258     }
259 
updateValue()260     void updateValue()
261     {
262         RawPropertyData rawData = {0};
263         if (!getRawValue(rawData.data(), rawData.size())) {
264             m_value = m_defaultValue;
265             return;
266         }
267         m_value = m_converter(rawData, m_defaultValue);
268     }
269 
270     int m_handle = -1;
271     int m_commit = -1;
272     long long m_sysCommit = -1;
273     T m_value;
274     const T m_defaultValue;
275     const PropType m_propType;
276     std::string m_key;
277     DataConverter m_converter;
278 };
279 
280 using SwitchCache = CacheData<bool>;
281 using LogLevelCache = CacheData<uint16_t>;
282 
TextToBool(const RawPropertyData & data,bool defaultVal)283 static bool TextToBool(const RawPropertyData& data, bool defaultVal)
284 {
285     if (!strcmp(data.data(), "true")) {
286         return true;
287     } else if (!strcmp(data.data(), "false")) {
288         return false;
289     }
290     return defaultVal;
291 }
292 
TextToLogLevel(const RawPropertyData & data,uint16_t defaultVal)293 static uint16_t TextToLogLevel(const RawPropertyData& data, uint16_t defaultVal)
294 {
295     uint16_t level = PrettyStr2LogLevel(data.data());
296     if (level == LOG_LEVEL_MIN) {
297         level = defaultVal;
298     }
299     return level;
300 }
301 
IsPrivateSwitchOn()302 bool IsPrivateSwitchOn()
303 {
304     static auto *switchCache = new SwitchCache(TextToBool, true, PropType::PROP_PRIVATE);
305     if (switchCache == nullptr) {
306         return false;
307     }
308     return switchCache->getValue();
309 }
310 
IsOnceDebugOn()311 bool IsOnceDebugOn()
312 {
313     static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_ONCE_DEBUG);
314     if (switchCache == nullptr) {
315         return false;
316     }
317     return switchCache->getValue();
318 }
319 
IsPersistDebugOn()320 bool IsPersistDebugOn()
321 {
322     static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_PERSIST_DEBUG);
323     if (switchCache == nullptr) {
324         return false;
325     }
326     return switchCache->getValue();
327 }
328 
IsDebugOn()329 bool IsDebugOn()
330 {
331     return IsOnceDebugOn() || IsPersistDebugOn();
332 }
333 
IsDebuggableHap()334 bool IsDebuggableHap()
335 {
336     const char *path = getenv(HAP_DEBUGGABLE);
337     if ((path == nullptr) || (strcmp(path, "true") != 0)) {
338         return false;
339     }
340     return true;
341 }
342 
IsPrivateModeEnable()343 bool IsPrivateModeEnable()
344 {
345     return !IsDebugOn() && !IsDebuggableHap() && IsPrivateSwitchOn();
346 }
347 
GetGlobalLogLevel()348 uint16_t GetGlobalLogLevel()
349 {
350     uint16_t globalLevel = GetGlobalLevel();
351     if (globalLevel == LOG_LEVEL_MIN) {
352         globalLevel = GetPersistGlobalLevel();
353     }
354     return globalLevel;
355 }
356 
GetGlobalLevel()357 uint16_t GetGlobalLevel()
358 {
359     static auto *logLevelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, PropType::PROP_GLOBAL_LOG_LEVEL);
360     return logLevelCache->getValue();
361 }
362 
GetPersistGlobalLevel()363 uint16_t GetPersistGlobalLevel()
364 {
365     static auto *logLevelCache =
366                 new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, PropType::PROP_PERSIST_GLOBAL_LOG_LEVEL);
367     return logLevelCache->getValue();
368 }
369 
GetLevel(std::unordered_map<uint32_t,LogLevelCache * > * map,uint32_t key,PropType propType)370 uint16_t GetLevel(std::unordered_map<uint32_t, LogLevelCache*>* map, uint32_t key, PropType propType)
371 {
372     static shared_timed_mutex* levelMtx = new shared_timed_mutex;
373     std::decay<decltype(*map)>::type::iterator it;
374     {
375         ReadLock lock(*levelMtx);
376         it = map->find(key);
377         if (it != map->end()) {
378             LogLevelCache* levelCache = it->second;
379             return levelCache->getValue();
380         }
381     }
382     InsertLock lock(*levelMtx);
383     it = map->find(key); // secured for two thread went across above condition
384     if (it == map->end()) {
385         LogLevelCache* levelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, propType, Uint2HexStr(key));
386         auto result = map->insert({ key, levelCache });
387         if (!result.second) {
388             delete levelCache;
389             return LOG_LEVEL_MIN;
390         }
391         it = result.first;
392     }
393     LogLevelCache* levelCache = it->second;
394     return levelCache->getValue();
395 }
396 
GetLevel(std::unordered_map<std::string,LogLevelCache * > * map,const string & key,PropType propType)397 uint16_t GetLevel(std::unordered_map<std::string, LogLevelCache*>* map, const string& key, PropType propType)
398 {
399     static shared_timed_mutex* levelMtx = new shared_timed_mutex;
400     std::decay<decltype(*map)>::type::iterator it;
401     {
402         ReadLock lock(*levelMtx);
403         it = map->find(key);
404         if (it != map->end()) {
405             LogLevelCache* levelCache = it->second;
406             return levelCache->getValue();
407         }
408     }
409     InsertLock lock(*levelMtx);
410     it = map->find(key); // secured for two thread went across above condition
411     if (it == map->end()) {
412         LogLevelCache* levelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, propType, key);
413         auto result = map->insert({ key, levelCache });
414         if (!result.second) {
415             delete levelCache;
416             return LOG_LEVEL_MIN;
417         }
418         it = result.first;
419     }
420     LogLevelCache* levelCache = it->second;
421     return levelCache->getValue();
422 }
423 
GetDomainLevel(uint32_t domain)424 uint16_t GetDomainLevel(uint32_t domain)
425 {
426     static auto *domainMap = new std::unordered_map<uint32_t, LogLevelCache*>();
427     return GetLevel(domainMap, domain, PropType::PROP_DOMAIN_LOG_LEVEL);
428 }
429 
GetPersistDomainLevel(uint32_t domain)430 uint16_t GetPersistDomainLevel(uint32_t domain)
431 {
432     static auto *persistDomainMap = new std::unordered_map<uint32_t, LogLevelCache*>();
433     return GetLevel(persistDomainMap, domain, PropType::PROP_PERSIST_DOMAIN_LOG_LEVEL);
434 }
435 
GetTagLevel(const std::string & tag)436 uint16_t GetTagLevel(const std::string& tag)
437 {
438     static auto *tagMap = new std::unordered_map<std::string, LogLevelCache*>();
439     return GetLevel(tagMap, tag, PropType::PROP_TAG_LOG_LEVEL);
440 }
441 
GetPersistTagLevel(const std::string & tag)442 uint16_t GetPersistTagLevel(const std::string& tag)
443 {
444     static auto *persistTagMap = new std::unordered_map<std::string, LogLevelCache*>();
445     return GetLevel(persistTagMap, tag, PropType::PROP_PERSIST_TAG_LOG_LEVEL);
446 }
447 
448 
IsProcessSwitchOn()449 bool IsProcessSwitchOn()
450 {
451     static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_PROCESS_FLOWCTRL);
452     if (switchCache == nullptr) {
453         return false;
454     }
455     return switchCache->getValue();
456 }
457 
IsDomainSwitchOn()458 bool IsDomainSwitchOn()
459 {
460     static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_DOMAIN_FLOWCTRL);
461     if (switchCache == nullptr) {
462         return false;
463     }
464     return switchCache->getValue();
465 }
466 
IsKmsgSwitchOn()467 bool IsKmsgSwitchOn()
468 {
469     RawPropertyData rawData;
470     int ret = PropertyGet(GetPropertyName(PropType::PROP_KMSG), rawData.data(), HILOG_PROP_VALUE_MAX);
471     if (ret == RET_FAIL) {
472         return false;
473     }
474     return TextToBool(rawData, false);
475 }
476 
GetBufferSizePropName(uint16_t type,bool persist)477 static string GetBufferSizePropName(uint16_t type, bool persist)
478 {
479     string name = persist ? "persist.sys." : "";
480     string suffix;
481 
482     if (type >= LOG_TYPE_MAX) {
483         suffix = "global";
484     } else {
485         suffix = LogType2Str(type);
486     }
487 
488     return name + GetPropertyName(PropType::PROP_BUFFER_SIZE) + suffix;
489 }
490 
GetBufferSize(uint16_t type,bool persist)491 size_t GetBufferSize(uint16_t type, bool persist)
492 {
493     char value[HILOG_PROP_VALUE_MAX] = {0};
494 
495     if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) {
496         return 0;
497     }
498 
499     int ret = PropertyGet(GetBufferSizePropName(type, persist), value, HILOG_PROP_VALUE_MAX);
500     if (ret == RET_FAIL || value[0] == 0) {
501         return 0;
502     }
503 
504     return std::stoi(value);
505 }
506 
IsStatsEnable()507 bool IsStatsEnable()
508 {
509     RawPropertyData rawData;
510     int ret = PropertyGet(GetPropertyName(PropType::PROP_STATS_ENABLE), rawData.data(), HILOG_PROP_VALUE_MAX);
511     if (ret == RET_FAIL) {
512         return false;
513     }
514     return TextToBool(rawData, false);
515 }
516 
IsTagStatsEnable()517 bool IsTagStatsEnable()
518 {
519     RawPropertyData rawData;
520     int ret = PropertyGet(GetPropertyName(PropType::PROP_STATS_TAG_ENABLE), rawData.data(), HILOG_PROP_VALUE_MAX);
521     if (ret == RET_FAIL) {
522         return false;
523     }
524     return TextToBool(rawData, false);
525 }
526 
GetProcessQuota(const string & proc)527 int GetProcessQuota(const string& proc)
528 {
529     char value[HILOG_PROP_VALUE_MAX] = {0};
530     string prop = GetPropertyName(PropType::PROP_PROC_QUOTA) + proc;
531 
532     int ret = PropertyGet(prop, value, HILOG_PROP_VALUE_MAX);
533     if (ret == RET_FAIL || value[0] == 0) {
534         return DEFAULT_QUOTA;
535     }
536     return std::stoi(value);
537 }
538 
GetDomainQuota(uint32_t domain)539 int GetDomainQuota(uint32_t domain)
540 {
541     char value[HILOG_PROP_VALUE_MAX] = {0};
542     string prop = GetPropertyName(PropType::PROP_DOMAIN_QUOTA) + Uint2HexStr(domain);
543 
544     int ret = PropertyGet(prop, value, HILOG_PROP_VALUE_MAX);
545     if (ret == RET_FAIL || value[0] == 0) {
546         return DEFAULT_QUOTA;
547     }
548     return std::stoi(value);
549 }
550 
SetBoolValue(PropType type,bool val)551 static int SetBoolValue(PropType type, bool val)
552 {
553     string key = GetPropertyName(type);
554     return key == "" ? RET_FAIL : (PropertySet(key, val ? "true" : "false"));
555 }
556 
SetLevel(PropType type,const string & suffix,uint16_t lvl)557 static int SetLevel(PropType type, const string& suffix, uint16_t lvl)
558 {
559     string key = GetPropertyName(type) + suffix;
560     return key == "" ? RET_FAIL : (PropertySet(key, LogLevel2ShortStr(lvl)));
561 }
562 
SetPrivateSwitchOn(bool on)563 int SetPrivateSwitchOn(bool on)
564 {
565     return SetBoolValue(PropType::PROP_PRIVATE, on);
566 }
567 
SetOnceDebugOn(bool on)568 int SetOnceDebugOn(bool on)
569 {
570     return SetBoolValue(PropType::PROP_ONCE_DEBUG, on);
571 }
572 
SetPersistDebugOn(bool on)573 int SetPersistDebugOn(bool on)
574 {
575     return SetBoolValue(PropType::PROP_PERSIST_DEBUG, on);
576 }
577 
SetGlobalLevel(uint16_t lvl)578 int SetGlobalLevel(uint16_t lvl)
579 {
580     return SetLevel(PropType::PROP_GLOBAL_LOG_LEVEL, "", lvl);
581 }
582 
SetPersistGlobalLevel(uint16_t lvl)583 int SetPersistGlobalLevel(uint16_t lvl)
584 {
585     return SetLevel(PropType::PROP_PERSIST_GLOBAL_LOG_LEVEL, "", lvl);
586 }
587 
SetTagLevel(const std::string & tag,uint16_t lvl)588 int SetTagLevel(const std::string& tag, uint16_t lvl)
589 {
590     return SetLevel(PropType::PROP_TAG_LOG_LEVEL, tag, lvl);
591 }
592 
SetPersistTagLevel(const std::string & tag,uint16_t lvl)593 int SetPersistTagLevel(const std::string& tag, uint16_t lvl)
594 {
595     return SetLevel(PropType::PROP_PERSIST_TAG_LOG_LEVEL, tag, lvl);
596 }
597 
SetDomainLevel(uint32_t domain,uint16_t lvl)598 int SetDomainLevel(uint32_t domain, uint16_t lvl)
599 {
600     return SetLevel(PropType::PROP_DOMAIN_LOG_LEVEL, Uint2HexStr(domain), lvl);
601 }
602 
SetPersistDomainLevel(uint32_t domain,uint16_t lvl)603 int SetPersistDomainLevel(uint32_t domain, uint16_t lvl)
604 {
605     return SetLevel(PropType::PROP_PERSIST_DOMAIN_LOG_LEVEL, Uint2HexStr(domain), lvl);
606 }
607 
SetProcessSwitchOn(bool on)608 int SetProcessSwitchOn(bool on)
609 {
610     return SetBoolValue(PropType::PROP_PROCESS_FLOWCTRL, on);
611 }
612 
SetDomainSwitchOn(bool on)613 int SetDomainSwitchOn(bool on)
614 {
615     return SetBoolValue(PropType::PROP_DOMAIN_FLOWCTRL, on);
616 }
617 
SetKmsgSwitchOn(bool on)618 int SetKmsgSwitchOn(bool on)
619 {
620     return SetBoolValue(PropType::PROP_KMSG, on);
621 }
622 
SetBufferSize(uint16_t type,bool persist,size_t size)623 int SetBufferSize(uint16_t type, bool persist, size_t size)
624 {
625     if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) {
626         return RET_FAIL;
627     }
628     return PropertySet(GetBufferSizePropName(type, persist), to_string(size));
629 }
630 } // namespace HiviewDFX
631 } // namespace OHOS