diff --git a/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml b/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml index dd2b1bdf5b..4e8dc00b30 100644 --- a/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml +++ b/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml @@ -649,12 +649,12 @@ See https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replication/#creating-replicated-tables --> - + diff --git a/deploy/docker/clickhouse-setup/clickhouse-config.xml b/deploy/docker/clickhouse-setup/clickhouse-config.xml index f8213b6521..027f53f951 100644 --- a/deploy/docker/clickhouse-setup/clickhouse-config.xml +++ b/deploy/docker/clickhouse-setup/clickhouse-config.xml @@ -649,12 +649,12 @@ See https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replication/#creating-replicated-tables --> - + diff --git a/frontend/src/components/LogDetail/index.tsx b/frontend/src/components/LogDetail/index.tsx index 5421672529..b138718ed9 100644 --- a/frontend/src/components/LogDetail/index.tsx +++ b/frontend/src/components/LogDetail/index.tsx @@ -2,6 +2,7 @@ import './LogDetails.styles.scss'; import { Color, Spacing } from '@signozhq/design-tokens'; +import Convert from 'ansi-to-html'; import { Button, Divider, Drawer, Radio, Tooltip, Typography } from 'antd'; import { RadioChangeEvent } from 'antd/lib'; import cx from 'classnames'; @@ -10,8 +11,13 @@ import { LOCALSTORAGE } from 'constants/localStorage'; import ContextView from 'container/LogDetailedView/ContextView/ContextView'; import JSONView from 'container/LogDetailedView/JsonView'; import Overview from 'container/LogDetailedView/Overview'; -import { aggregateAttributesResourcesToString } from 'container/LogDetailedView/utils'; +import { + aggregateAttributesResourcesToString, + removeEscapeCharacters, + unescapeString, +} from 'container/LogDetailedView/utils'; import { useOptionsMenu } from 'container/OptionsMenu'; +import dompurify from 'dompurify'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useIsDarkMode } from 'hooks/useDarkMode'; import { useNotifications } from 'hooks/useNotifications'; @@ -28,11 +34,14 @@ import { useMemo, useState } from 'react'; import { useCopyToClipboard } from 'react-use'; import { Query, TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { DataSource, StringOperators } from 'types/common/queryBuilder'; +import { FORBID_DOM_PURIFY_TAGS } from 'utils/app'; import { VIEW_TYPES, VIEWS } from './constants'; import { LogDetailProps } from './LogDetail.interfaces'; import QueryBuilderSearchWrapper from './QueryBuilderSearchWrapper'; +const convert = new Convert(); + function LogDetail({ log, onClose, @@ -90,6 +99,17 @@ function LogDetail({ } }; + const htmlBody = useMemo( + () => ({ + __html: convert.toHtml( + dompurify.sanitize(unescapeString(log?.body || ''), { + FORBID_TAGS: [...FORBID_DOM_PURIFY_TAGS], + }), + ), + }), + [log?.body], + ); + const handleJSONCopy = (): void => { copyToClipboard(LogJsonData); notifications.success({ @@ -127,8 +147,8 @@ function LogDetail({ >