android_system_core/logd
Tom Cherry 79d54f7877 logd: remove FlushCommand
This code has evolved to the point that it LogReader::notifyNewLog()
executes FlushCommand on every socket.  FlushCommand then iterates
over all log reader threads in LogTimes and flushes triggers them to
flush logs if they match the client.  This can be simplified to simply
looping over all of the reads in LogTimes.

Code readability was the primary motivation here, but note that 64% of
LogReader::notifyNewLog() was spent looping over the sockets, and an
additional 78% of FlushCommand::runSocketCommand() was spent
repeatedly locking and unlocking the LogTimes lock.

Overall, this reduces the cost of LogReader::notifyNewLog() in
LogListener::onDataAvailable() from 5.91% to 2.93%.  This is the
critical path for handling incoming log messages, so it's a
non-trivial savings.

Test: logging unit tests
Test: unprivileged clients still cannot view privileged logs
Change-Id: Ic7620978a6c23e5e2cb179ff0c42b7cea52fc011
2020-05-04 11:19:44 -07:00
..
fuzz logd: separate PruneList from LogBuffer 2020-05-04 10:02:55 -07:00
tests logd: disable flaky logd.timeout test 2020-04-29 10:16:13 -07:00
.clang-format logd: use .clang-format-4 like the rest of system/core 2019-01-16 15:20:15 -08:00
Android.bp logd: remove FlushCommand 2020-05-04 11:19:44 -07:00
auditctl.cpp introduce auditctl and use it to configure SELinux throttling 2019-04-09 13:19:08 -07:00
CommandListener.cpp logd: separate PruneList from LogBuffer 2020-05-04 10:02:55 -07:00
CommandListener.h logd: separate PruneList from LogBuffer 2020-05-04 10:02:55 -07:00
event.logtags liblog: logprint supports number of seconds time event field 2017-04-14 12:54:25 -07:00
libaudit.c introduce auditctl and use it to configure SELinux throttling 2019-04-09 13:19:08 -07:00
libaudit.h introduce auditctl and use it to configure SELinux throttling 2019-04-09 13:19:08 -07:00
LogAudit.cpp Show bug_map links on user builds 2019-10-04 10:36:23 -07:00
LogAudit.h Logd: include app package name in selinux metadata 2018-05-03 22:40:18 -07:00
LogBuffer.cpp logd: rename mOldest -> oldest_ 2020-05-04 10:17:42 -07:00
LogBuffer.h logd: rename mOldest -> oldest_ 2020-05-04 10:17:42 -07:00
LogBufferElement.cpp Don't include log/log_read.h in log/log.h 2020-04-17 15:31:34 -07:00
LogBufferElement.h Revert "logd: drop mSequence from LogBufferElement" 2020-04-09 17:23:45 +00:00
LogCommand.cpp [logd] Modernize codebase by replacing NULL with nullptr 2018-07-13 17:50:55 -07:00
LogCommand.h logd: specify clang format 2017-03-13 10:31:09 -07:00
logd.rc logd: don't drop user/groups/capabilities/priority in drop_privs() 2019-06-07 15:52:27 +00:00
LogKlog.cpp Fix clang-tidy warnings in log_time.h 2019-01-17 14:45:19 +09:00
LogKlog.h Fix clang-tidy warnings in log_time.h 2019-01-17 14:45:19 +09:00
LogListener.cpp liblog: fixup log_id_t 2019-10-18 09:58:08 -07:00
LogListener.h Revert "Modularize logd." 2019-06-28 14:16:13 -07:00
LogReader.cpp logd: remove FlushCommand 2020-05-04 11:19:44 -07:00
LogReader.h Remove execute bit for source files 2018-07-13 17:45:39 -07:00
LogStatistics.cpp Revert "logd: validate and fill in socket credentials" 2019-06-28 14:16:00 -07:00
LogStatistics.h Revert "logd: validate and fill in socket credentials" 2019-06-28 14:16:00 -07:00
logtagd.rc Relax permissions on /data/misc/logd 2020-01-21 18:39:19 -08:00
LogTags.cpp logd: don't use SIGHUP to reinitialize 2020-05-04 10:02:51 -07:00
LogTags.h [logd] Modernize codebase by replacing NULL with nullptr 2018-07-13 17:50:55 -07:00
LogTimes.cpp logd: remove FlushCommand 2020-05-04 11:19:44 -07:00
LogTimes.h logd: remove FlushCommand 2020-05-04 11:19:44 -07:00
LogUtils.h logd: don't use SIGHUP to reinitialize 2020-05-04 10:02:51 -07:00
LogWhiteBlackList.cpp [logd] Modernize codebase by replacing NULL with nullptr 2018-07-13 17:50:55 -07:00
LogWhiteBlackList.h logd: specify clang format 2017-03-13 10:31:09 -07:00
main.cpp logd: separate PruneList from LogBuffer 2020-05-04 10:02:55 -07:00
OWNERS Add OWNERS. 2017-12-07 13:30:03 -08:00
README.auditd logd: selinux auditd initial commit 2014-04-07 10:51:00 -07:00
README.property Rename ro.device_owner system property 2020-02-19 10:34:36 +00:00

The properties that logd and friends react to are:

name                       type default  description
ro.logd.auditd             bool   true   Enable selinux audit daemon
ro.logd.auditd.dmesg       bool   true   selinux audit messages sent to dmesg.
ro.logd.auditd.main        bool   true   selinux audit messages sent to main.
ro.logd.auditd.events      bool   true   selinux audit messages sent to events.
persist.logd.security      bool   false  Enable security buffer.
ro.organization_owned      bool   false  Override persist.logd.security to false
ro.logd.kernel             bool+ svelte+ Enable klogd daemon
ro.logd.statistics         bool+ svelte+ Enable logcat -S statistics.
ro.debuggable              number        if not "1", logd.statistics &
                                         ro.logd.kernel default false.
logd.logpersistd.enable    bool   auto   Safe to start logpersist daemon service
logd.logpersistd          string persist Enable logpersist daemon, "logcatd"
                                         turns on logcat -f in logd context.
					 Responds to logcatd, clear and stop.
logd.logpersistd.buffer          persist logpersistd buffers to collect
logd.logpersistd.size            persist logpersistd size in MB
logd.logpersistd.rotate_kbytes   	 persist logpersistd outout file size in KB.
persist.logd.logpersistd   string        Enable logpersist daemon, "logcatd"
                                         turns on logcat -f in logd context.
persist.logd.logpersistd.buffer    all   logpersistd buffers to collect
persist.logd.logpersistd.size      256   logpersistd size in MB
persist.logd.logpersistd.count     256   sets max number of rotated logs to <count>.
persist.logd.logpersistd.rotate_kbytes   1024  logpersistd output file size in KB
persist.logd.size          number  ro    Global default size of the buffer for
                                         all log ids at initial startup, at
                                         runtime use: logcat -b all -G <value>
ro.logd.size               number svelte default for persist.logd.size. Larger
                                         platform default sizes than 256KB are
                                         known to not scale well under log spam
                                         pressure. Address the spam first,
                                         resist increasing the log buffer.
persist.logd.size.<buffer> number  ro    Size of the buffer for <buffer> log
ro.logd.size.<buffer>      number svelte default for persist.logd.size.<buffer>
ro.config.low_ram          bool   false  if true, logd.statistics,
                                         ro.logd.kernel default false,
                                         logd.size 64K instead of 256K.
persist.logd.filter        string        Pruning filter to optimize content.
                                         At runtime use: logcat -P "<string>"
ro.logd.filter       string "~! ~1000/!" default for persist.logd.filter.
                                         This default means to prune the
                                         oldest entries of chattiest UID, and
                                         the chattiest PID of system
                                         (1000, or AID_SYSTEM).
persist.logd.timestamp     string  ro    The recording timestamp source.
                                         "m[onotonic]" is the only supported
                                         key character, otherwise realtime.
ro.logd.timestamp        string realtime default for persist.logd.timestamp
log.tag                   string persist The global logging level, VERBOSE,
                                         DEBUG, INFO, WARN, ERROR, ASSERT or
                                         SILENT. Only the first character is
                                         the key character.
persist.log.tag            string build  default for log.tag
log.tag.<tag>             string persist The <tag> specific logging level.
persist.log.tag.<tag>      string build  default for log.tag.<tag>

NB:
- auto - managed by /init
- bool+ - "true", "false" and comma separated list of "eng" (forced false if
  ro.debuggable is not "1") or "svelte" (forced false if ro.config.low_ram is
  true).
- svelte - see ro.config.low_ram for details.
- svelte+ - see ro.config.low_ram and ro.debuggable for details.
- ro - <base property> temporary override, ro.<base property> platform default.
- persist - <base property> override, persist.<base property> platform default.
- build - VERBOSE for native, DEBUG for jvm isLoggable, or developer option.
- 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 or PID may be a '!' to instead reference the chattiest
  client, with the restriction that the PID must be in the UID group 1000
  (system or AID_SYSTEM).