android_system_core/logd
Tom Cherry b0263af5a8 logd: remove faulty optimization
TagNameKey contains a pointer to a std::string and a std::string_view,
such it can both own a string or reference a different string.  This
is meant to be a memory optimization.

This, however, is actually a net pessimization.  Due to these three
below cases and typical usage pattern.

Cases:
1) In the case where TagNameKey owns the string, 3 words are wasted,
one for the pointer and two for the std::string_view.

2) In the case where TagNameKey references a short string, the same 3
words are wasted.  This is because std::string has a feature called
"Short String Optimization" that means std::string does not allocate
for strings of sizes <= 10 on 32bit devices and <= 22 on 64bit
devices.

3) In the case where TagNameKey references a longer string than the
"Short String Optimization" limits, then this saves the string's
length in bytes.

Usage pattern:
After boot on 32 bit cuttlefish, there were 679 entries for the first
case, and only 69 in the third case.  The 679 entries have an overhead
of 679 * 3 * sizeof(void*) = 679 * 12 = 8148 bytes.  The 69 strings in
the third case have a total length and therefore savings of 1352
bytes.  This is a net pessimization of 6796 bytes.

I expect this same ratio to be similar throughout the device's uptime.

This situation is worse on 64 bit devices.  If cuttlefish were 64 bit,
then there would have been only 18 items in the third case due to the
larger "Short String Optimization" capacity, and the cost for the
first case would have doubled.

Given the above and the cost of maintaining extra code, this
optimization is removed and a std::string is used as the hash table
key instead.

Test: logging unit tests
Change-Id: I957c519b19edca4f7fc531d96b7144cf68bf4e16
2020-06-04 10:33:07 -07:00
..
fuzz logd: use libbase logging 2020-06-03 16:29:48 -07:00
.clang-format
Android.bp logd: create SimpleLogBuffer and implement ChattyLogBuffer in terms of it 2020-05-21 14:23:45 -07:00
AndroidTest.xml logd: add LogBufferTest.cpp 2020-05-18 15:51:08 -07:00
ChattyLogBuffer.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
ChattyLogBuffer.h logd: create SimpleLogBuffer and implement ChattyLogBuffer in terms of it 2020-05-21 14:23:45 -07:00
ChattyLogBufferTest.cpp logd: move leading_dropped logic into FlushTo() 2020-06-02 13:26:48 -07:00
CommandListener.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
CommandListener.h
LogAudit.cpp
LogAudit.h
LogBuffer.h logd: move leading_dropped logic into FlushTo() 2020-06-02 13:26:48 -07:00
LogBufferElement.cpp logd: Drop the LogStatistics dependency on LogBufferElement 2020-06-02 16:02:56 -07:00
LogBufferElement.h logd: Drop the LogStatistics dependency on LogBufferElement 2020-06-02 16:02:56 -07:00
LogBufferTest.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
LogBufferTest.h logd: drop can_read_security_logs 2020-06-01 14:45:02 -07:00
LogKlog.cpp
LogKlog.h
LogListener.cpp
LogListener.h
LogPermissions.cpp
LogPermissions.h
LogReader.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
LogReader.h
LogReaderList.cpp logd: create FlushToState class 2020-06-01 14:45:02 -07:00
LogReaderList.h logd: create FlushToState class 2020-06-01 14:45:02 -07:00
LogReaderThread.cpp logd: move leading_dropped logic into FlushTo() 2020-06-02 13:26:48 -07:00
LogReaderThread.h logd: move leading_dropped logic into FlushTo() 2020-06-02 13:26:48 -07:00
LogStatistics.cpp logd: remove faulty optimization 2020-06-04 10:33:07 -07:00
LogStatistics.h logd: remove faulty optimization 2020-06-04 10:33:07 -07:00
LogTags.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
LogTags.h logd: create SimpleLogBuffer and implement ChattyLogBuffer in terms of it 2020-05-21 14:23:45 -07:00
LogUtils.h logd: use libbase logging 2020-06-03 16:29:48 -07:00
LogWhiteBlackList.cpp
LogWhiteBlackList.h logd: format LogBufferElement and LogStatistics correctly 2020-06-02 11:38:44 -07:00
LogWriter.h logd: drop can_read_security_logs 2020-06-01 14:45:02 -07:00
OWNERS
README.auditd
README.property
SimpleLogBuffer.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
SimpleLogBuffer.h logd: move leading_dropped logic into FlushTo() 2020-06-02 13:26:48 -07:00
auditctl.cpp
event.logtags
libaudit.cpp logd: make liblogd just the core logd functionality 2020-05-18 13:03:48 -07:00
libaudit.h logd: make liblogd just the core logd functionality 2020-05-18 13:03:48 -07:00
logd.rc
logd_test.cpp logd: add LogBufferTest.cpp 2020-05-18 15:51:08 -07:00
logtagd.rc
main.cpp logd: use libbase logging 2020-06-03 16:29:48 -07:00
rwlock.h logd: use RAII locks and thread annotations 2020-05-21 11:07:04 -07:00

README.property

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).
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).