From 932f7acc81b3769d1d73545469667565d41cc46d Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Fri, 28 Aug 2015 08:02:59 -0700 Subject: [PATCH] logd: Add support for *.logd.filter - Add device (ro.logd.filter), persistent (persist.logd.filter) properties to control the default filters - Allow logcat -P default to produce expected results - Allow logcat -P disable to produce expected results Change-Id: I651cb705373ec1e88a99e4b9086da4f9668a468a --- logd/LogWhiteBlackList.cpp | 41 ++++++++++++++++++++++++++++++++++---- logd/README.property | 20 +++++++++++++------ logd/main.cpp | 1 + 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/logd/LogWhiteBlackList.cpp b/logd/LogWhiteBlackList.cpp index ad005ec33..c71beb547 100644 --- a/logd/LogWhiteBlackList.cpp +++ b/logd/LogWhiteBlackList.cpp @@ -17,6 +17,7 @@ #include #include +#include #include "LogWhiteBlackList.h" @@ -49,7 +50,8 @@ std::string Prune::format() { return std::string("/"); } -PruneList::PruneList() : mWorstUidEnabled(true) { +PruneList::PruneList() { + init(NULL); } PruneList::~PruneList() { @@ -72,13 +74,44 @@ int PruneList::init(const char *str) { it = mNaughty.erase(it); } - if (!str) { - return 0; + static const char _default[] = "default"; + // default here means take ro.logd.filter, persist.logd.filter then + // internal default in that order. + if (str && !strcmp(str, _default)) { + str = NULL; + } + static const char _disable[] = "disable"; + if (str && !strcmp(str, _disable)) { + str = ""; + } + + std::string filter; + + if (str) { + filter = str; + } else { + char property[PROPERTY_VALUE_MAX]; + property_get("ro.logd.filter", property, _default); + filter = property; + property_get("persist.logd.filter", property, filter.c_str()); + // default here means take ro.logd.filter + if (strcmp(property, _default)) { + filter = property; + } + } + + // default here means take internal default. + if (filter == _default) { + // See README.property for description of filter format + filter = "~!"; + } + if (filter == _disable) { + filter = ""; } mWorstUidEnabled = false; - for(; *str; ++str) { + for(str = filter.c_str(); *str; ++str) { if (isspace(*str)) { continue; } diff --git a/logd/README.property b/logd/README.property index a472efde9..05ef52852 100644 --- a/logd/README.property +++ b/logd/README.property @@ -12,16 +12,24 @@ ro.build.type string if user, logd.statistics & logd.klogd default false persist.logd.logpersistd string Enable logpersist daemon, "logcatd" turns on logcat -f in logd context -persist.logd.size number 256K default size of the buffer for all - log ids at initial startup, at runtime - use: logcat -b all -G +persist.logd.size number 256K Global default size of the buffer for + all log ids at initial startup, at + runtime use: logcat -b all -G persist.logd.size.main number 256K Size of the buffer for the main log persist.logd.size.system number 256K Size of the buffer for the system log persist.logd.size.radio number 256K Size of the buffer for the radio log persist.logd.size.event number 256K Size of the buffer for the event log persist.logd.size.crash number 256K Size of the buffer for the crash log +persist.logd.filter string Pruning filter to optimize content, + default is ro.logd.filter or + "~!" which means to prune the oldest + entries of chattiest UID. At runtime + use: logcat -P "" NB: -- number support multipliers (K or M) for convenience. Range is limited - to between 64K and 256M for log buffer sizes. Individual logs override the - global default. +- Number support multipliers (K or M) for convenience. Range is limited + to between 64K and 256M for log buffer sizes. Individual log buffer ids + such as main, system, ... override global default. +- Pruning filter is of form of a space-separated list of [~][UID][/PID] + references, where '~' prefix means to blacklist otherwise whitelist. For + blacklisting, UID may be a '!' to instead reference the chattiest client. diff --git a/logd/main.cpp b/logd/main.cpp index 13dda787a..cf8cb8f59 100644 --- a/logd/main.cpp +++ b/logd/main.cpp @@ -212,6 +212,7 @@ static void *reinit_thread_start(void * /*obj*/) { // Anything that reads persist. if (logBuf) { logBuf->init(); + logBuf->initPrune(NULL); } }