made logging output from tests work better

Previously, it didn't handle long structs etc well.
diff --git a/aos/common/logging/logging_impl.cc b/aos/common/logging/logging_impl.cc
index 714aaf1..f520b35 100644
--- a/aos/common/logging/logging_impl.cc
+++ b/aos/common/logging/logging_impl.cc
@@ -150,7 +150,7 @@
               static_cast<int>(message.message_length), message.message);
       break;
     case LogMessage::Type::kStruct: {
-      char buffer[1024];
+      char buffer[2048];
       size_t output_length = sizeof(buffer);
       size_t input_length = message.message_length;
       if (!PrintMessage(
@@ -244,13 +244,35 @@
                 static_cast<int>(sizeof(printed) - printed_bytes), printed);
 }
 
+void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
+                                           va_list ap) {
+  LogMessage message;
+  internal::FillInMessage(level, format, ap, &message);
+  HandleMessage(message);
+}
+
+void HandleMessageLogImplementation::LogStruct(
+    log_level level, const ::std::string &message_string, size_t size,
+    const MessageType *type, const ::std::function<size_t(char *)> &serialize) {
+  LogMessage message;
+  internal::FillInMessageStructure(level, message_string, size, type, serialize,
+                                   &message);
+  HandleMessage(message);
+}
+
+void HandleMessageLogImplementation::LogMatrix(
+    log_level level, const ::std::string &message_string, uint32_t type_id,
+    int rows, int cols, const void *data) {
+  LogMessage message;
+  internal::FillInMessageMatrix(level, message_string, type_id, rows, cols,
+                                data, &message);
+  HandleMessage(message);
+}
+
 StreamLogImplementation::StreamLogImplementation(FILE *stream)
     : stream_(stream) {}
 
-void StreamLogImplementation::DoLog(log_level level, const char *format,
-                                    va_list ap) {
-  LogMessage message;
-  internal::FillInMessage(level, format, ap, &message);
+void StreamLogImplementation::HandleMessage(const LogMessage &message) {
   internal::PrintMessage(stream_, message);
 }
 
diff --git a/aos/common/logging/logging_impl.h b/aos/common/logging/logging_impl.h
index 57f09ec..a55e768 100644
--- a/aos/common/logging/logging_impl.h
+++ b/aos/common/logging/logging_impl.h
@@ -196,14 +196,30 @@
   LogImplementation *next_;
 };
 
+// Implements all of the DoLog* methods in terms of a (pure virtual in this
+// class) HandleMessage method that takes a pointer to the message.
+class HandleMessageLogImplementation : public LogImplementation {
+ public:
+  __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 3, 0)))
+  virtual void DoLog(log_level level, const char *format, va_list ap) override;
+  virtual void LogStruct(log_level level, const ::std::string &message_string,
+                         size_t size, const MessageType *type,
+                         const ::std::function<size_t(char *)> &serialize)
+      override;
+  virtual void LogMatrix(log_level level, const ::std::string &message_string,
+                         uint32_t type_id, int rows, int cols, const void *data)
+      override;
+
+  virtual void HandleMessage(const LogMessage &message) = 0;
+};
+
 // A log implementation that dumps all messages to a C stdio stream.
-class StreamLogImplementation : public LogImplementation {
+class StreamLogImplementation : public HandleMessageLogImplementation {
  public:
   StreamLogImplementation(FILE *stream);
 
  private:
-  __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 3, 0)))
-  virtual void DoLog(log_level level, const char *format, va_list ap);
+  virtual void HandleMessage(const LogMessage &message) override;
 
   FILE *const stream_;
 };
diff --git a/aos/common/queue_testutils.cc b/aos/common/queue_testutils.cc
index 5455859..4e62dcd 100644
--- a/aos/common/queue_testutils.cc
+++ b/aos/common/queue_testutils.cc
@@ -19,7 +19,7 @@
 namespace testing {
 namespace {
 
-class TestLogImplementation : public logging::LogImplementation {
+class TestLogImplementation : public logging::HandleMessageLogImplementation {
  public:
   const ::std::vector<LogMessage> &messages() { return messages_; }
 
@@ -49,13 +49,8 @@
     return new TestLogImplementation();
   }
 
-  __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 3, 0)))
-  virtual void DoLog(log_level level, const char *format, va_list ap) {
-    LogMessage message;
-
-    logging::internal::FillInMessage(level, format, ap, &message);
-
-    if (!logging::log_gt_important(WARNING, level)) {
+  virtual void HandleMessage(const LogMessage &message) override {
+    if (!logging::log_gt_important(WARNING, message.level)) {
       logging::internal::PrintMessage(stdout, message);
     }