diff --git a/assets/components/LogViewer/ComplexLogItem.vue b/assets/components/LogViewer/ComplexLogItem.vue
index 65e1785e..5b7b6fd7 100644
--- a/assets/components/LogViewer/ComplexLogItem.vue
+++ b/assets/components/LogViewer/ComplexLogItem.vue
@@ -5,9 +5,13 @@
{{ name }}=
<null>
-
-
-
+
+ [
+
+ {{ JSON.stringify(item) }}
+ , ]
+
all values are hidden
diff --git a/internal/support/web/escape.go b/internal/support/web/escape.go
index f37daf5b..63559cfe 100644
--- a/internal/support/web/escape.go
+++ b/internal/support/web/escape.go
@@ -15,7 +15,6 @@ import (
var urlMarkerRegex = regexp.MustCompile(URLMarkerStart + "(.*?)" + URLMarkerEnd)
func EscapeHTMLValues(logEvent *container.LogEvent) {
- // Mark URLs before HTML escaping
MarkURLs(logEvent)
switch value := logEvent.Message.(type) {
@@ -43,7 +42,6 @@ func escapeAndProcessMarkers(value string) string {
value = html.EscapeString(value)
value = strings.ReplaceAll(value, MarkerStart, "")
value = strings.ReplaceAll(value, MarkerEnd, "")
- // Process URL markers
value = urlMarkerRegex.ReplaceAllString(value, "$1")
return value
}
@@ -61,6 +59,11 @@ func escapeAnyMap(orderedMap *orderedmap.OrderedMap[string, any]) {
escapeMapStringInterface(value)
case map[string]string:
escapeStringMapString(value)
+ case []interface{}:
+ escapeSlice(value)
+ orderedMap.Set(pair.Key, value)
+ default:
+ log.Warn().Type("type", value).Msg("unknown logEvent type")
}
}
}
@@ -80,6 +83,8 @@ func escapeMapStringInterface(value map[string]interface{}) {
escapeMapStringInterface(val)
case map[string]string:
escapeStringMapString(val)
+ case []interface{}:
+ escapeSlice(val)
}
}
}
@@ -89,3 +94,22 @@ func escapeStringMapString(value map[string]string) {
value[key] = escapeAndProcessMarkers(val)
}
}
+
+func escapeSlice(slice []interface{}) {
+ for i, val := range slice {
+ switch val := val.(type) {
+ case string:
+ slice[i] = escapeAndProcessMarkers(val)
+ case *orderedmap.OrderedMap[string, any]:
+ escapeAnyMap(val)
+ case *orderedmap.OrderedMap[string, string]:
+ escapeStringMap(val)
+ case map[string]interface{}:
+ escapeMapStringInterface(val)
+ case map[string]string:
+ escapeStringMapString(val)
+ case []interface{}:
+ escapeSlice(val)
+ }
+ }
+}