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