Skip to content

Commit e7ae2eb

Browse files
authored
feat(#130): render exception as a string property type (#135)
1 parent c065147 commit e7ae2eb

File tree

42 files changed

+322
-62
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+322
-62
lines changed

samples/WebApi/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
})
4747
.WithName("GetWeatherForecast")
4848
.WithOpenApi();
49+
app.MapGet("/exception", () => { throw new InvalidOperationException("This route doesn't exist!"); });
4950

5051
app.Run();
5152

samples/WebApi/WebApi.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
<!-- Serilog UI packages -->
2323
<ItemGroup>
2424
<!-- comment/uncomment to directly reference Nuget release
25-
<PackageReference Include="Serilog.UI" Version="3.0.1"/>
26-
<PackageReference Include="Serilog.UI.MsSqlServerProvider" Version="3.0.0"/>
27-
<PackageReference Include="Serilog.UI.ElasticSearchProvider" Version="3.0.0"/>
25+
<PackageReference Include="Serilog.UI" Version="3.1.0"/>
26+
<PackageReference Include="Serilog.UI.MsSqlServerProvider" Version="3.1.0"/>
27+
<PackageReference Include="Serilog.UI.ElasticSearchProvider" Version="3.1.0"/>
2828
-->
2929

3030
<!-- comment/uncomment to directly reference solution projects -->

samples/WebApp/WebApp.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
<!-- Serilog UI packages -->
3939
<ItemGroup>
4040
<!-- comment/uncomment to directly reference Nuget release
41-
<PackageReference Include="Serilog.UI" Version="3.0.1"/>
42-
<PackageReference Include="Serilog.UI.MongoDbProvider" Version="3.0.0"/>
41+
<PackageReference Include="Serilog.UI" Version="3.1.0"/>
42+
<PackageReference Include="Serilog.UI.MongoDbProvider" Version="3.1.0"/>
4343
-->
4444

4545
<!-- comment/uncomment to directly reference solution projects -->

src/Serilog.Ui.Core/Interfaces/ISerilogUiOptionsBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,10 @@ public interface ISerilogUiOptionsBuilder
2626
/// <param name="providerKey">The IDataProvider <see cref="IDataProvider.Name"/>.</param>
2727
/// <typeparam name="T"></typeparam>
2828
void RegisterColumnsInfo<T>(string providerKey) where T : LogModel;
29+
30+
/// <summary>
31+
/// Register a Provider Key Name that saves the Exception field as string.
32+
/// </summary>
33+
/// <param name="providerKey">The IDataProvider <see cref="IDataProvider.Name"/>.</param>
34+
void RegisterExceptionAsStringForProviderKey(string providerKey);
2935
}

src/Serilog.Ui.Core/Models/Options/ProvidersOptions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public class ProvidersOptions
1414

1515
private readonly HashSet<string> _disabledSortProviderNames = [];
1616

17+
private readonly HashSet<string> _exceptionAsStringProviderNames = [];
18+
1719
/// <summary>
1820
/// Gets the AdditionalColumns.
1921
/// </summary>
@@ -25,6 +27,11 @@ public class ProvidersOptions
2527
/// </summary>
2628
public IEnumerable<string> DisabledSortProviderNames => _disabledSortProviderNames.ToList().AsReadOnly();
2729

30+
/// <summary>
31+
/// Gets the ExceptionAsStringProviderNames.
32+
/// </summary>
33+
public IEnumerable<string> ExceptionAsStringProviderNames => _exceptionAsStringProviderNames.ToList().AsReadOnly();
34+
2835
internal void RegisterType<T>(string providerKey)
2936
where T : LogModel
3037
{
@@ -35,4 +42,9 @@ internal void RegisterDisabledSortName(string name)
3542
{
3643
_disabledSortProviderNames.Add(name);
3744
}
45+
46+
internal void RegisterExceptionAsStringProvider(string name)
47+
{
48+
_exceptionAsStringProviderNames.Add(name);
49+
}
3850
}

src/Serilog.Ui.Core/OptionsBuilder/SerilogUiOptionsBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ public void RegisterColumnsInfo<T>(string providerKey) where T : LogModel
2929
_providersOptions.RegisterType<T>(providerKey);
3030
}
3131

32+
/// <inheritdoc />
33+
public void RegisterExceptionAsStringForProviderKey(string providerKey)
34+
{
35+
_providersOptions.RegisterExceptionAsStringProvider(providerKey);
36+
}
37+
3238
/// <summary>
3339
/// Register the <see cref="ProvidersOptions"/> in <see cref="IServiceCollection"/>.
3440
/// </summary>

src/Serilog.Ui.Core/Serilog.Ui.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<TargetFramework>netstandard2.0</TargetFramework>
44
<GenerateDocumentationFile>True</GenerateDocumentationFile>
55
<LangVersion>latest</LangVersion>
6-
<Version>3.0.0</Version>
6+
<Version>3.1.0</Version>
77
</PropertyGroup>
88

99
<ItemGroup>

src/Serilog.Ui.ElasticSearchProvider/Serilog.Ui.ElasticSearchProvider.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<TargetFramework>netstandard2.0</TargetFramework>
77
<LangVersion>latest</LangVersion>
8-
<Version>3.0.0</Version>
8+
<Version>3.1.0</Version>
99

1010
<Authors>Ricardo Demauro - rmauro.dev</Authors>
1111
<Description>ElasticSearch data provider for Serilog UI.</Description>

src/Serilog.Ui.MongoDbProvider/Serilog.Ui.MongoDbProvider.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<PackageId>Serilog.UI.MongoDbProvider</PackageId>
55
<TargetFramework>netstandard2.0</TargetFramework>
66
<LangVersion>latest</LangVersion>
7-
<Version>3.0.0</Version>
7+
<Version>3.1.0</Version>
88

99
<Authors>Christian Haase</Authors>
1010
<Description>MongoDB data provider for Serilog UI.</Description>

src/Serilog.Ui.MsSqlServerProvider/Extensions/SerilogUiOptionBuilderExtensions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,15 @@ public static ISerilogUiOptionsBuilder UseSqlServer<T>(
4343
setupOptions(dbOptions);
4444
dbOptions.Validate();
4545

46+
var providerName = dbOptions.GetProviderName(SqlServerDataProvider.MsSqlProviderName);
47+
48+
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
4649
SqlMapper.AddTypeHandler(new DapperDateTimeHandler(dateTimeCustomParsing));
4750

4851
var customModel = typeof(T) != typeof(SqlServerLogModel);
4952
if (customModel)
5053
{
51-
optionsBuilder.RegisterColumnsInfo<T>(dbOptions.GetProviderName(SqlServerDataProvider.MsSqlProviderName));
54+
optionsBuilder.RegisterColumnsInfo<T>(providerName);
5255
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new SqlServerDataProvider<T>(dbOptions));
5356

5457
return optionsBuilder;

src/Serilog.Ui.MsSqlServerProvider/Serilog.Ui.MsSqlServerProvider.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<TargetFramework>netstandard2.0</TargetFramework>
77
<LangVersion>latest</LangVersion>
8-
<Version>3.0.0</Version>
8+
<Version>3.1.0</Version>
99

1010
<Description>Microsoft SQL Server data provider for Serilog UI.</Description>
1111
<PackageTags>serilog serilog-ui serilog.sinks.mssqlserver mssqlserver</PackageTags>

src/Serilog.Ui.MsSqlServerProvider/SqlServerDataProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,13 @@ private void GenerateWhereClause(StringBuilder queryBuilder, FetchLogsQuery quer
124124
{
125125
var conditionStart = "WHERE";
126126

127-
if (!string.IsNullOrEmpty(queryParams.Level))
127+
if (!string.IsNullOrWhiteSpace(queryParams.Level))
128128
{
129129
queryBuilder.Append($"{conditionStart} [{ColumnLevelName}] = @Level ");
130130
conditionStart = "AND";
131131
}
132132

133-
if (!string.IsNullOrEmpty(queryParams.SearchCriteria))
133+
if (!string.IsNullOrWhiteSpace(queryParams.SearchCriteria))
134134
{
135135
queryBuilder.Append($"{conditionStart} [{ColumnMessageName}] LIKE @Search {SearchCriteriaWhereQuery()} ");
136136
conditionStart = "AND";

src/Serilog.Ui.MySqlProvider/Extensions/SerilogUiOptionBuilderExtensions.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ Action<RelationalDbOptions> setupOptions
2727
setupOptions(dbOptions);
2828
dbOptions.Validate();
2929

30+
var providerName = dbOptions.GetProviderName(MySqlDataProvider.MySqlProviderName);
31+
32+
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
33+
3034
optionsBuilder.Services.AddScoped<IDataProvider, MySqlDataProvider>(_ => new MySqlDataProvider(dbOptions));
3135

3236
return optionsBuilder;
@@ -61,10 +65,14 @@ Action<RelationalDbOptions> setupOptions
6165
setupOptions(dbOptions);
6266
dbOptions.Validate();
6367

68+
var providerName = dbOptions.GetProviderName(MariaDbDataProvider.ProviderName);
69+
70+
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
71+
6472
var customModel = typeof(T) != typeof(MySqlLogModel);
6573
if (customModel)
6674
{
67-
optionsBuilder.RegisterColumnsInfo<T>(dbOptions.GetProviderName(MariaDbDataProvider.ProviderName));
75+
optionsBuilder.RegisterColumnsInfo<T>(providerName);
6876
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new MariaDbDataProvider<T>(dbOptions));
6977
return optionsBuilder;
7078
}

src/Serilog.Ui.MySqlProvider/MySqlDataProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ protected override string SelectQuery
1010

1111
protected override string SearchCriteriaWhereQuery() => "OR Exception LIKE @Search";
1212

13-
public override string Name => Options.GetProviderName("MySQL");
13+
internal const string MySqlProviderName = "MySQL";
14+
public override string Name => Options.GetProviderName(MySqlProviderName);
1415
}

src/Serilog.Ui.MySqlProvider/Serilog.Ui.MySqlProvider.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<PackageId>Serilog.UI.MySqlProvider</PackageId>
55
<TargetFramework>netstandard2.0</TargetFramework>
66
<LangVersion>latest</LangVersion>
7-
<Version>3.0.0</Version>
7+
<Version>3.1.0</Version>
88

99
<Description>MySQL and MariaDB data provider for Serilog UI.</Description>
1010
<PackageTags>serilog serilog-ui serilog.sinks.mysql serilog.sinks.mariadb</PackageTags>

src/Serilog.Ui.MySqlProvider/Shared/DataProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@ private void GenerateWhereClause(StringBuilder queryBuilder, FetchLogsQuery quer
114114
{
115115
var conditionStart = "WHERE";
116116

117-
if (!string.IsNullOrEmpty(queryParams.Level))
117+
if (!string.IsNullOrWhiteSpace(queryParams.Level))
118118
{
119119
queryBuilder.Append($"WHERE {ColumnLevelName} = @Level ");
120120
conditionStart = "AND";
121121
}
122122

123-
if (!string.IsNullOrEmpty(queryParams.SearchCriteria))
123+
if (!string.IsNullOrWhiteSpace(queryParams.SearchCriteria))
124124
{
125125
queryBuilder.Append($"{conditionStart} ({ColumnMessageName} LIKE @Search {SearchCriteriaWhereQuery()}) ");
126126
conditionStart = "AND";

src/Serilog.Ui.PostgreSqlProvider/Extensions/SerilogUiOptionBuilderExtensions.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,14 @@ Action<PostgreSqlDbOptions> setupOptions
3636
setupOptions(dbOptions);
3737
dbOptions.Validate();
3838

39+
var providerName = dbOptions.GetProviderName(PostgresDataProvider.ProviderName);
40+
41+
optionsBuilder.RegisterExceptionAsStringForProviderKey(providerName);
42+
3943
var customModel = typeof(T) != typeof(PostgresLogModel);
4044
if (customModel)
4145
{
42-
optionsBuilder.RegisterColumnsInfo<T>(dbOptions.GetProviderName(PostgresDataProvider.ProviderName));
46+
optionsBuilder.RegisterColumnsInfo<T>(providerName);
4347
optionsBuilder.Services.AddScoped<IDataProvider>(_ => new PostgresDataProvider<T>(dbOptions));
4448

4549
return optionsBuilder;

src/Serilog.Ui.PostgreSqlProvider/Serilog.Ui.PostgreSqlProvider.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<PackageId>Serilog.UI.PostgreSqlProvider</PackageId>
55
<TargetFramework>netstandard2.0</TargetFramework>
66
<LangVersion>latest</LangVersion>
7-
<Version>3.0.0</Version>
7+
<Version>3.1.0</Version>
88

99
<GenerateDocumentationFile>True</GenerateDocumentationFile>
1010

src/Serilog.Ui.RavenDbProvider/Serilog.Ui.RavenDbProvider.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<PackageId>Serilog.Ui.RavenDbProvider</PackageId>
55
<TargetFramework>netstandard2.0</TargetFramework>
66
<LangVersion>latest</LangVersion>
7-
<Version>2.0.0</Version>
7+
<Version>2.1.0</Version>
88

99
<Nullable>enable</Nullable>
1010
<ImplicitUsings>enable</ImplicitUsings>

src/Serilog.Ui.Web/Endpoints/SerilogUiAppRoutes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ private async Task<string> LoadStream(Stream stream, UiOptions options)
7373
authType,
7474
options.ColumnsInfo,
7575
options.DisabledSortOnKeys,
76+
options.RenderExceptionAsStringKeys,
7677
options.ShowBrand,
7778
options.HomeUrl,
7879
BlockHomeAccess,

src/Serilog.Ui.Web/Models/UiOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ internal void Validate()
157157
/// </summary>
158158
internal IEnumerable<string> DisabledSortOnKeys { get; } = options.DisabledSortProviderNames;
159159

160+
/// <summary>
161+
/// Gets or sets the database keys that renders exceptions as simple strings.
162+
/// </summary>
163+
internal IEnumerable<string> RenderExceptionAsStringKeys { get; } = options.ExceptionAsStringProviderNames;
164+
160165
/// <summary>
161166
/// Gets or sets the head content, a string that will be placed in the &lt;head&gt; of the index.html
162167
/// </summary>

src/Serilog.Ui.Web/Serilog.Ui.Web.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<PackageId>Serilog.UI</PackageId>
55
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
66
<LangVersion>latest</LangVersion>
7-
<Version>3.0.1</Version>
7+
<Version>3.1.0</Version>
88
</PropertyGroup>
99

1010
<ItemGroup>
@@ -35,4 +35,4 @@
3535
<_Parameter1>DynamicProxyGenAssembly2</_Parameter1>
3636
</AssemblyAttribute>
3737
</ItemGroup>
38-
</Project>
38+
</Project>

src/Serilog.Ui.Web/src/__tests__/_setup/testing-utils.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const Wrapper = ({
3636
homeUrl: 'https://test-google.com',
3737
columnsInfo,
3838
disabledSortOnKeys: ['disabled-sort-db'],
39+
renderExceptionAsStringKeys: ['exception-string-sample'],
3940
})}
4041
</div>
4142

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { renderHook } from '__tests__/_setup/testing-utils';
2+
import { useException } from 'app/hooks/useException';
3+
import { describe, expect, it, vi } from 'vitest';
4+
5+
const mockForm = {
6+
watch: vi.fn(),
7+
getValues: vi.fn(),
8+
};
9+
const mockColInfo = { removeException: vi.fn() };
10+
vi.mock('../../app/hooks/useSearchForm', () => ({
11+
useSearchForm: () => mockForm,
12+
}));
13+
vi.mock('../../app/hooks/useColumnsInfo', () => ({
14+
useColumnsInfo: () => mockColInfo,
15+
}));
16+
17+
describe('useException', () => {
18+
it('returns properties untouched', () => {
19+
mockForm.getValues.mockImplementation(() => 'test-db');
20+
mockForm.watch.mockImplementation(() => 'test-db');
21+
22+
const { result } = renderHook(() => useException('my-string untouched', 'log'));
23+
24+
expect(result.current.logType).toBe('log');
25+
expect(result.current.exceptionContent).toBe('my-string untouched');
26+
});
27+
28+
it('returns string type, with modified content', () => {
29+
mockForm.getValues.mockImplementation(() => 'exception-string-sample');
30+
mockForm.watch.mockImplementation(() => 'exception-string-sample');
31+
mockColInfo.removeException.mockReturnValue(true);
32+
33+
const { result } = renderHook(() =>
34+
useException('my-string modified with at sample', 'log'),
35+
);
36+
37+
expect(result.current.removeException).toBeTruthy();
38+
expect(result.current.logType).toBe('string');
39+
expect(result.current.exceptionContent).toBe('my-string modified with at sample');
40+
});
41+
});

src/Serilog.Ui.Web/src/app/components/Table/CodeContent.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { Box, Loader } from '@mantine/core';
1+
import { Box, Loader, Textarea } from '@mantine/core';
22
import { renderCodeContent } from 'app/util/prettyPrints';
33
import { useEffect, useState } from 'react';
44
import classes from 'style/table.module.css';
55
import { LogType } from 'types/types';
6+
import { CopySection } from '../Util/Copy';
67

78
const CodeContent = ({ content, codeType }: { content: string; codeType: LogType }) => {
89
const [codeContent, setCodeContent] = useState<TrustedHTML>('');
@@ -26,10 +27,24 @@ const CodeContent = ({ content, codeType }: { content: string; codeType: LogType
2627
</Box>
2728
);
2829

30+
if ((codeType as unknown as string) === 'string')
31+
return (
32+
<Textarea
33+
autosize
34+
value={codeContent as string}
35+
disabled
36+
rightSectionPointerEvents="all"
37+
rightSection={<CopySection value={codeContent as string} />}
38+
minRows={1}
39+
maxRows={20}
40+
classNames={{ input: classes.modalTextAreaInputWrapper }}
41+
/>
42+
);
43+
2944
return (
3045
<div
3146
dangerouslySetInnerHTML={{ __html: codeContent }}
32-
className={classes.detailModalCode}
47+
className={classes.modalCode}
3348
></div>
3449
);
3550
};

0 commit comments

Comments
 (0)