logd: allow opting into simple or serialized log buffers

Test: set properties and see logd use the appropriate buffer.
Change-Id: I2dcce7d9661a43adfafb69427d9271ee7ee29f43
This commit is contained in:
Tom Cherry 2020-07-14 09:52:24 -07:00
parent 63e7541faa
commit c1edd66317
2 changed files with 24 additions and 13 deletions

View File

@ -52,6 +52,9 @@ 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

View File

@ -38,6 +38,7 @@
#include <android-base/logging.h>
#include <android-base/macros.h>
#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <cutils/android_get_control_file.h>
#include <cutils/sockets.h>
@ -61,6 +62,8 @@
#include "SerializedLogBuffer.h"
#include "SimpleLogBuffer.h"
using android::base::GetProperty;
#define KMSG_PRIORITY(PRI) \
'<', '0' + LOG_MAKEPRI(LOG_DAEMON, LOG_PRI(PRI)) / 10, \
'0' + LOG_MAKEPRI(LOG_DAEMON, LOG_PRI(PRI)) % 10, '>'
@ -255,28 +258,33 @@ int main(int argc, char* argv[]) {
// Pruning configuration.
PruneList prune_list;
std::string buffer_type = GetProperty("logd.buffer_type", "chatty");
// Partial (required for chatty) or full logging statistics.
bool enable_full_log_statistics = __android_logger_property_get_bool(
"logd.statistics", BOOL_DEFAULT_TRUE | BOOL_DEFAULT_FLAG_PERSIST |
BOOL_DEFAULT_FLAG_ENG | BOOL_DEFAULT_FLAG_SVELTE);
LogStatistics log_statistics(enable_full_log_statistics, false);
LogStatistics log_statistics(enable_full_log_statistics, buffer_type == "serialized");
// Serves the purpose of managing the last logs times read on a
// socket connection, and as a reader lock on a range of log
// entries.
// Serves the purpose of managing the last logs times read on a socket connection, and as a
// reader lock on a range of log entries.
LogReaderList reader_list;
// LogBuffer is the object which is responsible for holding all log entries.
LogBuffer* logBuf;
if (true) {
logBuf = new ChattyLogBuffer(&reader_list, &log_tags, &prune_list, &log_statistics);
LogBuffer* log_buffer = nullptr;
if (buffer_type == "chatty") {
log_buffer = new ChattyLogBuffer(&reader_list, &log_tags, &prune_list, &log_statistics);
} else if (buffer_type == "serialized") {
log_buffer = new SerializedLogBuffer(&reader_list, &log_tags, &log_statistics);
} else if (buffer_type == "simple") {
log_buffer = new SimpleLogBuffer(&reader_list, &log_tags, &log_statistics);
} else {
logBuf = new SimpleLogBuffer(&reader_list, &log_tags, &log_statistics);
LOG(FATAL) << "buffer_type must be one of 'chatty', 'serialized', or 'simple'";
}
// LogReader listens on /dev/socket/logdr. When a client
// connects, log entries in the LogBuffer are written to the client.
LogReader* reader = new LogReader(logBuf, &reader_list);
LogReader* reader = new LogReader(log_buffer, &reader_list);
if (reader->startListener()) {
return EXIT_FAILURE;
}
@ -284,14 +292,14 @@ int main(int argc, char* argv[]) {
// LogListener listens on /dev/socket/logdw for client
// initiated log messages. New log entries are added to LogBuffer
// and LogReader is notified to send updates to connected clients.
LogListener* swl = new LogListener(logBuf);
LogListener* swl = new LogListener(log_buffer);
if (!swl->StartListener()) {
return EXIT_FAILURE;
}
// Command listener listens on /dev/socket/logd for incoming logd
// administrative commands.
CommandListener* cl = new CommandListener(logBuf, &log_tags, &prune_list, &log_statistics);
CommandListener* cl = new CommandListener(log_buffer, &log_tags, &prune_list, &log_statistics);
if (cl->startListener()) {
return EXIT_FAILURE;
}
@ -304,12 +312,12 @@ int main(int argc, char* argv[]) {
int dmesg_fd = __android_logger_property_get_bool("ro.logd.auditd.dmesg", BOOL_DEFAULT_TRUE)
? fdDmesg
: -1;
al = new LogAudit(logBuf, dmesg_fd, &log_statistics);
al = new LogAudit(log_buffer, dmesg_fd, &log_statistics);
}
LogKlog* kl = nullptr;
if (klogd) {
kl = new LogKlog(logBuf, fdDmesg, fdPmesg, al != nullptr, &log_statistics);
kl = new LogKlog(log_buffer, fdDmesg, fdPmesg, al != nullptr, &log_statistics);
}
readDmesg(al, kl);