• 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 
GetGlobalLogLevel()343 uint16_t GetGlobalLogLevel()
344 {
345     uint16_t globalLevel = GetGlobalLevel();
346     if (globalLevel == LOG_LEVEL_MIN) {
347         globalLevel = GetPersistGlobalLevel();
348     }
349     return globalLevel;
350 }
351 
GetGlobalLevel()352 uint16_t GetGlobalLevel()
353 {
354     static auto *logLevelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, PropType::PROP_GLOBAL_LOG_LEVEL);
355     return logLevelCache->getValue();
356 }
357 
GetPersistGlobalLevel()358 uint16_t GetPersistGlobalLevel()
359 {
360     static auto *logLevelCache =
361                 new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, PropType::PROP_PERSIST_GLOBAL_LOG_LEVEL);
362     return logLevelCache->getValue();
363 }
364 
GetLevel(std::unordered_map<uint32_t,LogLevelCache * > * map,uint32_t key,PropType propType)365 uint16_t GetLevel(std::unordered_map<uint32_t, LogLevelCache*>* map, uint32_t key, PropType propType)
366 {
367     static shared_timed_mutex* levelMtx = new shared_timed_mutex;
368     std::decay<decltype(*map)>::type::iterator it;
369     {
370         ReadLock lock(*levelMtx);
371         it = map->find(key);
372         if (it != map->end()) {
373             LogLevelCache* levelCache = it->second;
374             return levelCache->getValue();
375         }
376     }
377     InsertLock lock(*levelMtx);
378     it = map->find(key); // secured for two thread went across above condition
379     if (it == map->end()) {
380         LogLevelCache* levelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, propType, Uint2HexStr(key));
381         auto result = map->insert({ key, levelCache });
382         if (!result.second) {
383             delete levelCache;
384             return LOG_LEVEL_MIN;
385         }
386         it = result.first;
387     }
388     LogLevelCache* levelCache = it->second;
389     return levelCache->getValue();
390 }
391 
GetLevel(std::unordered_map<std::string,LogLevelCache * > * map,const string & key,PropType propType)392 uint16_t GetLevel(std::unordered_map<std::string, LogLevelCache*>* map, const string& key, PropType propType)
393 {
394     static shared_timed_mutex* levelMtx = new shared_timed_mutex;
395     std::decay<decltype(*map)>::type::iterator it;
396     {
397         ReadLock lock(*levelMtx);
398         it = map->find(key);
399         if (it != map->end()) {
400             LogLevelCache* levelCache = it->second;
401             return levelCache->getValue();
402         }
403     }
404     InsertLock lock(*levelMtx);
405     it = map->find(key); // secured for two thread went across above condition
406     if (it == map->end()) {
407         LogLevelCache* levelCache = new LogLevelCache(TextToLogLevel, LOG_LEVEL_MIN, propType, key);
408         auto result = map->insert({ key, levelCache });
409         if (!result.second) {
410             delete levelCache;
411             return LOG_LEVEL_MIN;
412         }
413         it = result.first;
414     }
415     LogLevelCache* levelCache = it->second;
416     return levelCache->getValue();
417 }
418 
GetDomainLevel(uint32_t domain)419 uint16_t GetDomainLevel(uint32_t domain)
420 {
421     static auto *domainMap = new std::unordered_map<uint32_t, LogLevelCache*>();
422     return GetLevel(domainMap, domain, PropType::PROP_DOMAIN_LOG_LEVEL);
423 }
424 
GetPersistDomainLevel(uint32_t domain)425 uint16_t GetPersistDomainLevel(uint32_t domain)
426 {
427     static auto *persistDomainMap = new std::unordered_map<uint32_t, LogLevelCache*>();
428     return GetLevel(persistDomainMap, domain, PropType::PROP_PERSIST_DOMAIN_LOG_LEVEL);
429 }
430 
GetTagLevel(const std::string & tag)431 uint16_t GetTagLevel(const std::string& tag)
432 {
433     static auto *tagMap = new std::unordered_map<std::string, LogLevelCache*>();
434     return GetLevel(tagMap, tag, PropType::PROP_TAG_LOG_LEVEL);
435 }
436 
GetPersistTagLevel(const std::string & tag)437 uint16_t GetPersistTagLevel(const std::string& tag)
438 {
439     static auto *persistTagMap = new std::unordered_map<std::string, LogLevelCache*>();
440     return GetLevel(persistTagMap, tag, PropType::PROP_PERSIST_TAG_LOG_LEVEL);
441 }
442 
443 
IsProcessSwitchOn()444 bool IsProcessSwitchOn()
445 {
446     static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_PROCESS_FLOWCTRL);
447     if (switchCache == nullptr) {
448         return false;
449     }
450     return switchCache->getValue();
451 }
452 
IsDomainSwitchOn()453 bool IsDomainSwitchOn()
454 {
455     static auto *switchCache = new SwitchCache(TextToBool, false, PropType::PROP_DOMAIN_FLOWCTRL);
456     if (switchCache == nullptr) {
457         return false;
458     }
459     return switchCache->getValue();
460 }
461 
IsKmsgSwitchOn()462 bool IsKmsgSwitchOn()
463 {
464     RawPropertyData rawData;
465     int ret = PropertyGet(GetPropertyName(PropType::PROP_KMSG), rawData.data(), HILOG_PROP_VALUE_MAX);
466     if (ret == RET_FAIL) {
467         return false;
468     }
469     return TextToBool(rawData, false);
470 }
471 
GetBufferSizePropName(uint16_t type,bool persist)472 static string GetBufferSizePropName(uint16_t type, bool persist)
473 {
474     string name = persist ? "persist.sys." : "";
475     string suffix;
476 
477     if (type >= LOG_TYPE_MAX) {
478         suffix = "global";
479     } else {
480         suffix = LogType2Str(type);
481     }
482 
483     return name + GetPropertyName(PropType::PROP_BUFFER_SIZE) + suffix;
484 }
485 
GetBufferSize(uint16_t type,bool persist)486 size_t GetBufferSize(uint16_t type, bool persist)
487 {
488     char value[HILOG_PROP_VALUE_MAX] = {0};
489 
490     if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) {
491         return 0;
492     }
493 
494     int ret = PropertyGet(GetBufferSizePropName(type, persist), value, HILOG_PROP_VALUE_MAX);
495     if (ret == RET_FAIL || value[0] == 0) {
496         return 0;
497     }
498 
499     return std::stoi(value);
500 }
501 
IsStatsEnable()502 bool IsStatsEnable()
503 {
504     RawPropertyData rawData;
505     int ret = PropertyGet(GetPropertyName(PropType::PROP_STATS_ENABLE), rawData.data(), HILOG_PROP_VALUE_MAX);
506     if (ret == RET_FAIL) {
507         return false;
508     }
509     return TextToBool(rawData, false);
510 }
511 
IsTagStatsEnable()512 bool IsTagStatsEnable()
513 {
514     RawPropertyData rawData;
515     int ret = PropertyGet(GetPropertyName(PropType::PROP_STATS_TAG_ENABLE), rawData.data(), HILOG_PROP_VALUE_MAX);
516     if (ret == RET_FAIL) {
517         return false;
518     }
519     return TextToBool(rawData, false);
520 }
521 
GetProcessQuota(const string & proc)522 int GetProcessQuota(const string& proc)
523 {
524     char value[HILOG_PROP_VALUE_MAX] = {0};
525     string prop = GetPropertyName(PropType::PROP_PROC_QUOTA) + proc;
526 
527     int ret = PropertyGet(prop, value, HILOG_PROP_VALUE_MAX);
528     if (ret == RET_FAIL || value[0] == 0) {
529         return DEFAULT_QUOTA;
530     }
531     return std::stoi(value);
532 }
533 
GetDomainQuota(uint32_t domain)534 int GetDomainQuota(uint32_t domain)
535 {
536     char value[HILOG_PROP_VALUE_MAX] = {0};
537     string prop = GetPropertyName(PropType::PROP_DOMAIN_QUOTA) + Uint2HexStr(domain);
538 
539     int ret = PropertyGet(prop, value, HILOG_PROP_VALUE_MAX);
540     if (ret == RET_FAIL || value[0] == 0) {
541         return DEFAULT_QUOTA;
542     }
543     return std::stoi(value);
544 }
545 
SetBoolValue(PropType type,bool val)546 static int SetBoolValue(PropType type, bool val)
547 {
548     string key = GetPropertyName(type);
549     return key == "" ? RET_FAIL : (PropertySet(key, val ? "true" : "false"));
550 }
551 
SetLevel(PropType type,const string & suffix,uint16_t lvl)552 static int SetLevel(PropType type, const string& suffix, uint16_t lvl)
553 {
554     string key = GetPropertyName(type) + suffix;
555     return key == "" ? RET_FAIL : (PropertySet(key, LogLevel2ShortStr(lvl)));
556 }
557 
SetPrivateSwitchOn(bool on)558 int SetPrivateSwitchOn(bool on)
559 {
560     return SetBoolValue(PropType::PROP_PRIVATE, on);
561 }
562 
SetOnceDebugOn(bool on)563 int SetOnceDebugOn(bool on)
564 {
565     return SetBoolValue(PropType::PROP_ONCE_DEBUG, on);
566 }
567 
SetPersistDebugOn(bool on)568 int SetPersistDebugOn(bool on)
569 {
570     return SetBoolValue(PropType::PROP_PERSIST_DEBUG, on);
571 }
572 
SetGlobalLevel(uint16_t lvl)573 int SetGlobalLevel(uint16_t lvl)
574 {
575     return SetLevel(PropType::PROP_GLOBAL_LOG_LEVEL, "", lvl);
576 }
577 
SetPersistGlobalLevel(uint16_t lvl)578 int SetPersistGlobalLevel(uint16_t lvl)
579 {
580     return SetLevel(PropType::PROP_PERSIST_GLOBAL_LOG_LEVEL, "", lvl);
581 }
582 
SetTagLevel(const std::string & tag,uint16_t lvl)583 int SetTagLevel(const std::string& tag, uint16_t lvl)
584 {
585     return SetLevel(PropType::PROP_TAG_LOG_LEVEL, tag, lvl);
586 }
587 
SetPersistTagLevel(const std::string & tag,uint16_t lvl)588 int SetPersistTagLevel(const std::string& tag, uint16_t lvl)
589 {
590     return SetLevel(PropType::PROP_PERSIST_TAG_LOG_LEVEL, tag, lvl);
591 }
592 
SetDomainLevel(uint32_t domain,uint16_t lvl)593 int SetDomainLevel(uint32_t domain, uint16_t lvl)
594 {
595     return SetLevel(PropType::PROP_DOMAIN_LOG_LEVEL, Uint2HexStr(domain), lvl);
596 }
597 
SetPersistDomainLevel(uint32_t domain,uint16_t lvl)598 int SetPersistDomainLevel(uint32_t domain, uint16_t lvl)
599 {
600     return SetLevel(PropType::PROP_PERSIST_DOMAIN_LOG_LEVEL, Uint2HexStr(domain), lvl);
601 }
602 
SetProcessSwitchOn(bool on)603 int SetProcessSwitchOn(bool on)
604 {
605     return SetBoolValue(PropType::PROP_PROCESS_FLOWCTRL, on);
606 }
607 
SetDomainSwitchOn(bool on)608 int SetDomainSwitchOn(bool on)
609 {
610     return SetBoolValue(PropType::PROP_DOMAIN_FLOWCTRL, on);
611 }
612 
SetKmsgSwitchOn(bool on)613 int SetKmsgSwitchOn(bool on)
614 {
615     return SetBoolValue(PropType::PROP_KMSG, on);
616 }
617 
SetBufferSize(uint16_t type,bool persist,size_t size)618 int SetBufferSize(uint16_t type, bool persist, size_t size)
619 {
620     if (type > LOG_TYPE_MAX || type < LOG_TYPE_MIN) {
621         return RET_FAIL;
622     }
623     return PropertySet(GetBufferSizePropName(type, persist), to_string(size));
624 }
625 } // namespace HiviewDFX
626 } // namespace OHOS