[logs] Add option to disable symbolizer

This adds an option to completely disable
the symbolizer process.

Fixed: b/321026549
Change-Id: If388936b2b103542b1817fbceb164f6e13218513
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/976334
Commit-Queue: Brian Bosak <bbosak@google.com>
Reviewed-by: Miguel Flores <miguelfrde@google.com>
diff --git a/src/developer/ffx/plugins/log/src/lib.rs b/src/developer/ffx/plugins/log/src/lib.rs
index d018e0b..9d2b851 100644
--- a/src/developer/ffx/plugins/log/src/lib.rs
+++ b/src/developer/ffx/plugins/log/src/lib.rs
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+use async_trait::async_trait;
 use error::LogError;
 use ffx_log_args::LogCommand;
 use fho::{daemon_protocol, FfxMain, FfxTool, MachineWriter, ToolIO};
@@ -12,7 +13,7 @@
 use log_command::{
     log_formatter::{
         dump_logs_from_socket, BootTimeAccessor, DefaultLogFormatter, LogEntry, LogFormatter,
-        WriterContainer,
+        Symbolize, WriterContainer,
     },
     InstanceGetter, LogSubCommand, WatchCommand,
 };
@@ -41,6 +42,15 @@
     cmd: LogCommand,
 }
 
+struct NoOpSymoblizer;
+
+#[async_trait(?Send)]
+impl Symbolize for NoOpSymoblizer {
+    async fn symbolize(&self, entry: LogEntry) -> LogEntry {
+        entry
+    }
+}
+
 fho::embedded_plugin!(LogTool);
 
 #[async_trait::async_trait(?Send)]
@@ -60,9 +70,17 @@
     target_collection_proxy: TargetCollectionProxy,
     cmd: LogCommand,
 ) -> Result<(), LogError> {
+    let no_symbolize = cmd.no_symbolize;
     let instance_getter = rcs::root_realm_query(&rcs_proxy, TIMEOUT).await?;
-    log_main(writer, rcs_proxy, target_collection_proxy, cmd, LogSymbolizer::new(), instance_getter)
-        .await
+    log_main(
+        writer,
+        rcs_proxy,
+        target_collection_proxy,
+        cmd,
+        if no_symbolize { None } else { Some(LogSymbolizer::new()) },
+        instance_getter,
+    )
+    .await
 }
 
 // Main logging event loop.
@@ -71,7 +89,7 @@
     rcs_proxy: RemoteControlProxy,
     target_collection_proxy: TargetCollectionProxy,
     cmd: LogCommand,
-    symbolizer: impl Symbolizer,
+    symbolizer: Option<impl Symbolizer>,
     instance_getter: impl InstanceGetter,
 ) -> Result<(), LogError>
 where
@@ -165,13 +183,16 @@
     target_query: TargetQuery,
     cmd: LogCommand,
     mut formatter: impl LogFormatter + BootTimeAccessor + WriterContainer<W>,
-    symbolizer: impl Symbolizer,
+    symbolizer: Option<impl Symbolizer>,
     realm_query: &impl InstanceGetter,
 ) -> Result<(), LogError>
 where
     W: ToolIO<OutputItem = LogEntry> + Write,
 {
-    let symbolizer_channel = SymbolizerChannel::new(symbolizer).await?;
+    let symbolizer_channel: Box<dyn Symbolize> = match symbolizer {
+        Some(inner) => Box::new(SymbolizerChannel::new(inner).await?),
+        None => Box::new(NoOpSymoblizer {}),
+    };
     let mut stream_mode = get_stream_mode(cmd.clone())?;
     // TODO(https://fxbug.dev/129624): Add support for reconnect handling to Overnet.
     // This plugin needs special logic to handle reconnects as logging should tolerate
@@ -219,8 +240,12 @@
         )
         .await?;
         formatter.set_boot_timestamp(connection.boot_timestamp as i64);
-        let maybe_err =
-            dump_logs_from_socket(connection.log_socket, &mut formatter, &symbolizer_channel).await;
+        let maybe_err = dump_logs_from_socket(
+            connection.log_socket,
+            &mut formatter,
+            symbolizer_channel.as_ref(),
+        )
+        .await;
         if stream_mode == fidl_fuchsia_diagnostics::StreamMode::Snapshot {
             break;
         }
@@ -361,7 +386,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -404,7 +429,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -463,7 +488,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             getter,
         ));
 
@@ -517,7 +542,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             getter,
         ));
 
@@ -555,7 +580,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
 
@@ -589,7 +614,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -629,7 +654,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -670,7 +695,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -722,7 +747,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -797,7 +822,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -878,7 +903,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
 
@@ -954,7 +979,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
 
@@ -1072,7 +1097,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1148,7 +1173,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1200,7 +1225,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1255,7 +1280,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1307,7 +1332,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1360,7 +1385,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1413,7 +1438,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1454,7 +1479,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1509,7 +1534,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
@@ -1565,7 +1590,7 @@
             rcs_proxy,
             target_collection_proxy,
             cmd,
-            symbolizer,
+            Some(symbolizer),
             FakeInstanceGetter::default(),
         ));
         // Run all tasks until exit.
diff --git a/src/developer/ffx/tests/cli-goldens/goldens/ffx/log.golden b/src/developer/ffx/tests/cli-goldens/goldens/ffx/log.golden
index fad87e4..634540d 100644
--- a/src/developer/ffx/tests/cli-goldens/goldens/ffx/log.golden
+++ b/src/developer/ffx/tests/cli-goldens/goldens/ffx/log.golden
@@ -202,6 +202,14 @@
       "hidden": false
     },
     {
+      "kind": "Switch",
+      "optionality": "optional",
+      "long": "--no-symbolize",
+      "short": null,
+      "description": "if provided, the symbolizer will not be spawned like raw, but actually disables the symbolizer process.",
+      "hidden": false
+    },
+    {
       "kind": {
         "Option": {
           "arg_name": "select"
diff --git a/src/diagnostics/lib/log-command/src/lib.rs b/src/diagnostics/lib/log-command/src/lib.rs
index ac56e8c..ad894d1 100644
--- a/src/diagnostics/lib/log-command/src/lib.rs
+++ b/src/diagnostics/lib/log-command/src/lib.rs
@@ -234,6 +234,13 @@
     #[argh(switch)]
     pub raw: bool,
 
+    /// if provided, the symbolizer will not be spawned
+    /// like raw, but actually disables the symbolizer
+    /// process.
+    #[cfg(not(target_os = "fuchsia"))]
+    #[argh(switch)]
+    pub no_symbolize: bool,
+
     /// configure the log settings on the target device for components matching
     /// the given selector. This modifies the minimum log severity level emitted
     /// by components during the logging session.
@@ -287,6 +294,8 @@
             tid: None,
             #[cfg(target_os = "fuchsia")]
             json: false,
+            #[cfg(not(target_os = "fuchsia"))]
+            no_symbolize: false,
         }
     }
 }
diff --git a/src/diagnostics/lib/log-command/src/log_formatter.rs b/src/diagnostics/lib/log-command/src/log_formatter.rs
index b3a7463..3fe5dd8 100644
--- a/src/diagnostics/lib/log-command/src/log_formatter.rs
+++ b/src/diagnostics/lib/log-command/src/log_formatter.rs
@@ -108,7 +108,7 @@
 ) -> Result<(), JsonDeserializeError>
 where
     F: LogFormatter + BootTimeAccessor,
-    S: Symbolize,
+    S: Symbolize + ?Sized,
 {
     let boot_ts = formatter.get_boot_timestamp();
 
@@ -131,7 +131,7 @@
 ) -> Result<(), JsonDeserializeError>
 where
     F: LogFormatter + BootTimeAccessor,
-    S: Symbolize,
+    S: Symbolize + ?Sized,
 {
     let mut decoder = Box::pin(LogsDataStream::new(socket));
     while let Some(log) = decoder.next().await {