59caa7a045
When calculating the space used for pruning, if a log chunk is compressed, that size is used otherwise the uncompressed size is used. This is intended to reach a steady state where 1/4 of the log buffer is the uncompressed log chunk that is being written to and the other 3/4 of the log buffer is compressed logs. If we wait until there are no readers referencing the log chunk before compressing it, we end up with 2 uncompressed logs (the one that was just filled, that readers are still referencing, and the new one that was allocated to fit the most recent log), which take up 1/2 of the log buffer's allotted size and will thus cause prune to delete more compressed logs than it should. Instead, we should always compress the log chunks in FinishWriting() such that the compressed size will always be used for log chunks other than the one that is not actively written to. Decompressed logs due to readers are ephemeral by their nature and thus don't add to the log buffer size for pruning. Test: observe that log buffers can be filled in the presence of a reader. Change-Id: Ie21ccff032e41c4a0e51710cc435c5ab316563cb |
||
---|---|---|
.. | ||
fuzz | ||
.clang-format | ||
Android.bp | ||
AndroidTest.xml | ||
auditctl.cpp | ||
ChattyLogBuffer.cpp | ||
ChattyLogBuffer.h | ||
ChattyLogBufferTest.cpp | ||
CommandListener.cpp | ||
CommandListener.h | ||
CompressionEngine.cpp | ||
CompressionEngine.h | ||
event.logtags | ||
libaudit.cpp | ||
libaudit.h | ||
LogAudit.cpp | ||
LogAudit.h | ||
LogBuffer.h | ||
LogBufferElement.cpp | ||
LogBufferElement.h | ||
LogBufferTest.cpp | ||
LogBufferTest.h | ||
logd.rc | ||
logd_test.cpp | ||
LogKlog.cpp | ||
LogKlog.h | ||
LogListener.cpp | ||
LogListener.h | ||
LogPermissions.cpp | ||
LogPermissions.h | ||
LogReader.cpp | ||
LogReader.h | ||
LogReaderList.cpp | ||
LogReaderList.h | ||
LogReaderThread.cpp | ||
LogReaderThread.h | ||
LogStatistics.cpp | ||
LogStatistics.h | ||
logtagd.rc | ||
LogTags.cpp | ||
LogTags.h | ||
LogUtils.h | ||
LogWriter.h | ||
main.cpp | ||
OWNERS | ||
PruneList.cpp | ||
PruneList.h | ||
README.auditd | ||
README.property | ||
rwlock.h | ||
SerializedData.h | ||
SerializedFlushToState.cpp | ||
SerializedFlushToState.h | ||
SerializedFlushToStateTest.cpp | ||
SerializedLogBuffer.cpp | ||
SerializedLogBuffer.h | ||
SerializedLogChunk.cpp | ||
SerializedLogChunk.h | ||
SerializedLogChunkTest.cpp | ||
SerializedLogEntry.h | ||
SimpleLogBuffer.cpp | ||
SimpleLogBuffer.h |
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> logd.buffer_type string (empty) Set the log buffer type. Current choices are 'simple', 'chatty', or 'serialized'. Defaults to 'chatty' if empty. 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 rules are specified as UID, UID/PID or /PID. A '~' prefix indicates that elements matching the rule should be pruned with higher priority otherwise they're pruned with lower priority. All other pruning activity is oldest first. Special case ~! represents an automatic pruning for the noisiest UID as determined by the current statistics. Special case ~1000/! represents pruning of the worst PID within AID_SYSTEM when AID_SYSTEM is the noisiest UID.