Convert Byte Arrays to Hexidecimal Strings When Writing to LTTng via EventSource...
authorBrian Robbins <brianrob@microsoft.com>
Tue, 6 Mar 2018 19:31:40 +0000 (11:31 -0800)
committerGitHub <noreply@github.com>
Tue, 6 Mar 2018 19:31:40 +0000 (11:31 -0800)
src/mscorlib/src/System/Diagnostics/Eventing/XplatEventLogger.cs

index d8057f3..31f79f5 100644 (file)
@@ -109,24 +109,51 @@ namespace System.Diagnostics.Tracing
                 sb.Append("\\\"");
                 sb.Append(':');
 
-                var valuestr = payload[i] as string;
-
-                if( valuestr != null)
-                {
-                    sb.Append("\\\"");
-                    minimalJsonserializer(valuestr,sb);
-                    sb.Append("\\\"");
-                }
-                else
+                switch(payload[i])
                 {
-                    sb.Append(payload[i].ToString());
+                    case string str:
+                    {
+                        sb.Append("\\\"");
+                        minimalJsonserializer(str, sb);
+                        sb.Append("\\\"");
+                        break;
+                    }
+                    case byte[] byteArr:
+                    {
+                        sb.Append("\\\"");
+                        AppendByteArrayAsHexString(sb, byteArr);
+                        sb.Append("\\\"");
+                        break;
+                    }
+                    default:
+                    {
+                        if(payload[i] != null)
+                        {
+                            sb.Append(payload[i].ToString());
+                        }
+                        break;
+                    }
                 }
-
             }
             sb.Append('}');
             return StringBuilderCache.GetStringAndRelease(sb);
         }
 
+        private static void AppendByteArrayAsHexString(StringBuilder builder, byte[] byteArray)
+        {
+            Debug.Assert(builder != null);
+            Debug.Assert(byteArray != null);
+
+            ReadOnlySpan<char> hexFormat = "X2";
+            Span<char> hex = stackalloc char[2];
+            for(int i=0; i<byteArray.Length; i++)
+            {
+                byteArray[i].TryFormat(hex, out int charsWritten, hexFormat);
+                Debug.Assert(charsWritten == 2);
+                builder.Append(hex);
+            }
+        }
+
         internal protected  override void OnEventSourceCreated(EventSource eventSource)
         {
             string eventSourceFilter = eventSourceNameFilter.Value;