aos: add dynamic logging on an opt-in basis

Applications including this can have vlog changed with:

aos_send /aos aos.logging.DynamicLogCommand '{"name": "app", "vlog_level": 1}'

Change-Id: Id387cdb501ad84ed3e266a2077ea93478b480afa
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/logging/dynamic_logging.cc b/aos/logging/dynamic_logging.cc
new file mode 100644
index 0000000..d28fba2
--- /dev/null
+++ b/aos/logging/dynamic_logging.cc
@@ -0,0 +1,34 @@
+#include "aos/logging/dynamic_logging.h"
+#include "glog/logging.h"
+
+namespace aos {
+namespace logging {
+
+DynamicLogging::DynamicLogging(aos::EventLoop *event_loop)
+    : application_name_(event_loop->name()) {
+  if (event_loop->GetChannel<DynamicLogCommand>("/aos") == nullptr) {
+    LOG(WARNING) << "Disabling dynamic logger because the DynamicLogCommand "
+                    "channel is not configured.";
+  } else {
+    event_loop->MakeWatcher("/aos", [this](const DynamicLogCommand &cmd) {
+      HandleDynamicLogCommand(cmd);
+    });
+  }
+}
+
+void DynamicLogging::HandleDynamicLogCommand(const DynamicLogCommand &command) {
+  // For now we expect someone to do an aos_send at the command line, thecommand
+  // may be malformed.
+  if (!command.has_name() || !command.has_vlog_level()) return;
+
+  if (command.name()->string_view() != application_name_) {
+    return;
+  }
+  if (command.vlog_level() < 0) {
+    return;
+  }
+  FLAGS_v = command.vlog_level();
+}
+
+}  // namespace logging
+}  // namespace aos