Skip to content

Commit 5329057

Browse files
committed
Update packages and refactor Serilog configuration
Updated various project files to use the latest package versions, enhancing stability and feature access. Refactored Serilog configuration by migrating settings from `appsettings.json` to `SerilogExtensions.cs` for improved maintainability and readability. Introduced a new method `WriteToSeq` for Seq logging configuration. Removed online user UI elements from `ThemesMenu.razor`. Added `Serilog-Configuration-Migration.md` to document the changes and benefits of the new logging configuration approach.
1 parent cd0bd95 commit 5329057

File tree

12 files changed

+233
-109
lines changed

12 files changed

+233
-109
lines changed

docker-compose.dcproj

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="15.0" Sdk="Microsoft.Docker.Sdk">
3-
<PropertyGroup Label="Globals">
4-
<ProjectVersion>2.1</ProjectVersion>
5-
<DockerTargetOS>Linux</DockerTargetOS>
6-
<ProjectGuid>6bd2ec46-fa8f-44f3-af33-903bbb347116</ProjectGuid>
7-
<DockerLaunchAction>LaunchBrowser</DockerLaunchAction>
8-
<DockerServiceUrl>{Scheme}://localhost:{ServicePort}</DockerServiceUrl>
9-
<DockerServiceName>dashboard</DockerServiceName>
10-
</PropertyGroup>
11-
<ItemGroup>
12-
<None Include="docker-compose.yml"/>
13-
<None Include="docker-compose.override.yml"/>
14-
<None Include=".dockerignore"/>
15-
</ItemGroup>
16-
<ItemGroup>
17-
<None Remove="launchSettings.json"/>
18-
</ItemGroup>
19-
<ItemGroup>
20-
<None Remove="src\**"/>
21-
</ItemGroup>
3+
<PropertyGroup Label="Globals">
4+
<ProjectVersion>2.1</ProjectVersion>
5+
<DockerTargetOS>Linux</DockerTargetOS>
6+
<ProjectGuid>6bd2ec46-fa8f-44f3-af33-903bbb347116</ProjectGuid>
7+
<DockerLaunchAction>LaunchBrowser</DockerLaunchAction>
8+
<DockerServiceUrl>{Scheme}://localhost:{ServicePort}</DockerServiceUrl>
9+
<DockerServiceName>dashboard</DockerServiceName>
10+
</PropertyGroup>
11+
<ItemGroup>
12+
<None Include="docker-compose.yml" />
13+
<None Include="docker-compose.override.yml" />
14+
<None Include=".dockerignore" />
15+
<None Include="docs\Serilog-Configuration-Migration.md" />
16+
</ItemGroup>
17+
<ItemGroup>
18+
<None Remove="launchSettings.json" />
19+
</ItemGroup>
20+
<ItemGroup>
21+
<None Remove="src\**" />
22+
</ItemGroup>
2223
</Project>
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# Serilog 配置迁移说明
2+
3+
## 概述
4+
本次迁移将 Serilog 的配置从 `appsettings.json` 迁移到代码中的 `SerilogExtensions.cs`,提高了配置的可维护性和可读性。
5+
6+
## 迁移内容
7+
8+
### 1. 最小日志级别配置 (MinimumLevel)
9+
以下配置已从 `appsettings.json` 迁移到 `SerilogExtensions.cs`
10+
11+
```csharp
12+
.MinimumLevel.Debug()
13+
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
14+
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error)
15+
.MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Warning)
16+
.MinimumLevel.Override("System", LogEventLevel.Warning)
17+
.MinimumLevel.Override("System.Net.Http.HttpClient", LogEventLevel.Warning)
18+
```
19+
20+
### 2. 日志属性 (Properties)
21+
以下属性已添加到日志配置中:
22+
23+
```csharp
24+
.Enrich.WithProperty("Application", "BlazorApp")
25+
.Enrich.WithProperty("Environment", context.HostingEnvironment.EnvironmentName)
26+
.Enrich.WithProperty("TargetFramework", "net9")
27+
```
28+
29+
注意:`Environment` 属性现在会动态使用当前托管环境名称(Development、Staging、Production 等)。
30+
31+
### 3. Seq 日志接收器配置 (WriteTo Seq)
32+
Seq 配置逻辑已迁移到 `WriteToSeq` 方法中:
33+
34+
```csharp
35+
private static void WriteToSeq(LoggerConfiguration serilogConfig, IConfiguration configuration)
36+
{
37+
var serverUrl = configuration.GetValue<string>("SerilogSeq:ServerUrl") ?? "https://seq.blazorserver.com";
38+
var apiKey = configuration.GetValue<string>("SerilogSeq:ApiKey") ?? "none";
39+
var restrictedToMinimumLevel = configuration.GetValue<string>("SerilogSeq:MinimumLevel") ?? "Verbose";
40+
41+
if (!string.IsNullOrEmpty(serverUrl))
42+
{
43+
var minimumLevel = Enum.TryParse<LogEventLevel>(restrictedToMinimumLevel, true, out var level)
44+
? level
45+
: LogEventLevel.Verbose;
46+
47+
serilogConfig.WriteTo.Seq(
48+
serverUrl,
49+
apiKey: string.IsNullOrEmpty(apiKey) || apiKey == "none" ? null : apiKey,
50+
restrictedToMinimumLevel: minimumLevel
51+
);
52+
}
53+
}
54+
```
55+
56+
## 配置文件变更
57+
58+
### appsettings.json
59+
删除了原有的 `Serilog` 配置节,新增了 `SerilogSeq` 配置节:
60+
61+
```json
62+
{
63+
"SerilogSeq": {
64+
"ServerUrl": "https://seq.blazorserver.com",
65+
"ApiKey": "none",
66+
"MinimumLevel": "Verbose"
67+
}
68+
}
69+
```
70+
71+
## 优势
72+
73+
1. **代码集中管理**:所有 Serilog 配置逻辑现在都在 `SerilogExtensions.cs` 中,更容易维护和理解。
74+
75+
2. **灵活的配置覆盖**:通过 `SerilogSeq` 配置节,仍然可以在不同环境中覆盖 Seq 配置,无需重新编译。
76+
77+
3. **默认值支持**:代码中提供了合理的默认值,即使配置文件中缺少某些配置也能正常运行。
78+
79+
4. **类型安全**:配置在代码中,可以利用编译器进行类型检查,减少配置错误。
80+
81+
5. **动态环境感知**`Environment` 属性会自动使用当前托管环境名称。
82+
83+
## 迁移后的配置结构
84+
85+
### 必需配置(在代码中)
86+
- 最小日志级别
87+
- 日志属性(Application, Environment, TargetFramework)
88+
- 文件和控制台输出配置
89+
90+
### 可选配置(在 appsettings.json 中)
91+
- Seq 服务器 URL
92+
- Seq API 密钥
93+
- Seq 最小日志级别
94+
95+
## 使用建议
96+
97+
如果您需要在不同环境中使用不同的 Seq 配置,可以在对应的 `appsettings.{Environment}.json` 文件中覆盖 `SerilogSeq` 配置:
98+
99+
```json
100+
// appsettings.Development.json
101+
{
102+
"SerilogSeq": {
103+
"ServerUrl": "http://localhost:5341",
104+
"ApiKey": "your-dev-api-key",
105+
"MinimumLevel": "Debug"
106+
}
107+
}
108+
109+
// appsettings.Production.json
110+
{
111+
"SerilogSeq": {
112+
"ServerUrl": "https://seq.blazorserver.com",
113+
"ApiKey": "your-prod-api-key",
114+
"MinimumLevel": "Information"
115+
}
116+
}
117+
```
118+
119+
如果不需要 Seq 日志记录,可以删除 `SerilogSeq` 配置节,`WriteToSeq` 方法会使用默认值。

src/Application/Application.csproj

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@
99
</PropertyGroup>
1010
<ItemGroup>
1111

12-
<PackageReference Include="Ardalis.Specification" Version="8.0.0" />
13-
<PackageReference Include="Ardalis.Specification.EntityFrameworkCore" Version="8.0.0" />
14-
<PackageReference Include="ClosedXML" Version="0.104.2" />
15-
<PackageReference Include="jcamp.FluentEmail.Core" Version="3.8.0" />
16-
<PackageReference Include="jcamp.FluentEmail.MailKit" Version="3.8.0" />
17-
<PackageReference Include="jcamp.FluentEmail.Razor" Version="3.8.0" />
18-
<PackageReference Include="FluentValidation" Version="11.11.0" />
19-
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="11.11.0" />
20-
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.0" />
21-
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.0" />
22-
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
23-
<PackageReference Include="Riok.Mapperly" Version="4.1.1" />
24-
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.5.1" />
25-
<PackageReference Include="Hangfire.Core" Version="1.8.17" />
26-
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.0.0-preview-3" />
27-
<PackageReference Include="ActualLab.Fusion" Version="9.8.3" />
28-
<PackageReference Include="ActualLab.Fusion.Blazor" Version="9.8.3" />
29-
<PackageReference Include="ActualLab.Generators" Version="9.8.3">
12+
<PackageReference Include="Ardalis.Specification" Version="9.3.1" />
13+
<PackageReference Include="Ardalis.Specification.EntityFrameworkCore" Version="9.3.1" />
14+
<PackageReference Include="ClosedXML" Version="0.105.0" />
15+
<PackageReference Include="jcamp.FluentEmail.Core" Version="4.0.0" />
16+
<PackageReference Include="jcamp.FluentEmail.MailKit" Version="4.0.0" />
17+
<PackageReference Include="jcamp.FluentEmail.Razor" Version="4.0.0" />
18+
<PackageReference Include="FluentValidation" Version="12.1.0" />
19+
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.0" />
20+
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.10" />
21+
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.10" />
22+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
23+
<PackageReference Include="Riok.Mapperly" Version="4.3.0" />
24+
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.6.10" />
25+
<PackageReference Include="Hangfire.Core" Version="1.8.22" />
26+
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.4.0" />
27+
<PackageReference Include="ActualLab.Fusion" Version="11.1.4" />
28+
<PackageReference Include="ActualLab.Fusion.Blazor" Version="11.1.4" />
29+
<PackageReference Include="ActualLab.Generators" Version="11.1.4">
3030
<PrivateAssets>all</PrivateAssets>
3131
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3232
</PackageReference>

src/Domain/Domain.csproj

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,23 @@
1111

1212
<ItemGroup>
1313
<PackageReference Include="MediatR" Version="12.4.1" />
14-
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
15-
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.0" />
14+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.10" />
15+
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.10" />
1616
<PackageReference Include="EntityFrameworkCore.Exceptions.PostgreSQL" Version="8.1.3" />
1717
<PackageReference Include="EntityFrameworkCore.Exceptions.Sqlite" Version="8.1.3" />
1818
<PackageReference Include="EntityFrameworkCore.Exceptions.SqlServer" Version="8.1.3" />
19-
<PackageReference Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="9.0.0" />
20-
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.2" />
21-
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.0" />
22-
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
19+
<PackageReference Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="9.0.10" />
20+
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
21+
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.10" />
22+
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.10" />
2323
<PackageReference Include="EFCore.NamingConventions" Version="9.0.0" />
24-
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="9.0.0" />
25-
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.0" />
26-
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.0">
24+
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="9.0.10" />
25+
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.10" />
26+
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.10">
2727
<PrivateAssets>all</PrivateAssets>
2828
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2929
</PackageReference>
30-
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="9.0.0" />
30+
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="9.0.10" />
3131
</ItemGroup>
3232

3333
</Project>

src/Infrastructure/Extensions/SerilogExtensions.cs

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,14 @@ public static void RegisterSerilog(this WebApplicationBuilder builder)
2323
{
2424
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
2525
builder.Host.UseSerilog((context, configuration) =>
26-
configuration.ReadFrom.Configuration(context.Configuration)
27-
.MinimumLevel.Override("Microsoft", LogEventLevel.Error)
26+
configuration
27+
// Configure minimum log levels
28+
.MinimumLevel.Information()
29+
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
2830
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Error)
31+
.MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Warning)
32+
.MinimumLevel.Override("System", LogEventLevel.Warning)
33+
.MinimumLevel.Override("System.Net.Http.HttpClient", LogEventLevel.Warning)
2934
.MinimumLevel.Override("MudBlazor", LogEventLevel.Information)
3035
.MinimumLevel.Override("Serilog", LogEventLevel.Information)
3136
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.AddOrUpdate", LogEventLevel.Error)
@@ -42,9 +47,14 @@ public static void RegisterSerilog(this WebApplicationBuilder builder)
4247
.MinimumLevel.Override("ActualLab.Fusion.Internal.ComputedGraphPruner", LogEventLevel.Error)
4348
.MinimumLevel.Override("CleanArchitecture.Blazor.Server.UI.Services.Fusion.UserSessionTracker", LogEventLevel.Error)
4449
.MinimumLevel.Override("CleanArchitecture.Blazor.Server.UI.Services.Fusion.OnlineUserTracker", LogEventLevel.Error)
50+
// Add enrichment properties
4551
.Enrich.FromLogContext()
4652
.Enrich.WithUtcTime()
4753
.Enrich.WithUserInfo()
54+
.Enrich.WithProperty("Application", "BlazorApp")
55+
.Enrich.WithProperty("Environment", context.HostingEnvironment.EnvironmentName)
56+
.Enrich.WithProperty("TargetFramework", "net9")
57+
// Configure output sinks
4858
.WriteTo.Async(wt => wt.File("./log/log-.txt", rollingInterval: RollingInterval.Day))
4959
.WriteTo.Async(wt =>
5060
wt.Console(
@@ -56,9 +66,30 @@ public static void RegisterSerilog(this WebApplicationBuilder builder)
5666

5767
private static void ApplyConfigPreferences(this LoggerConfiguration serilogConfig, IConfiguration configuration)
5868
{
69+
WriteToSeq(serilogConfig, configuration);
5970
WriteToDatabase(serilogConfig, configuration);
6071
}
6172

73+
private static void WriteToSeq(LoggerConfiguration serilogConfig, IConfiguration configuration)
74+
{
75+
var serverUrl = "https://seq.blazorserver.com";
76+
var apiKey = "none";
77+
var restrictedToMinimumLevel = "Verbose";
78+
79+
if (!string.IsNullOrEmpty(serverUrl))
80+
{
81+
var minimumLevel = Enum.TryParse<LogEventLevel>(restrictedToMinimumLevel, true, out var level)
82+
? level
83+
: LogEventLevel.Verbose;
84+
85+
serilogConfig.WriteTo.Seq(
86+
serverUrl,
87+
apiKey: string.IsNullOrEmpty(apiKey) || apiKey == "none" ? null : apiKey,
88+
restrictedToMinimumLevel: minimumLevel
89+
);
90+
}
91+
}
92+
6293
private static void WriteToDatabase(LoggerConfiguration serilogConfig, IConfiguration configuration)
6394
{
6495
if (configuration.GetValue<bool>("UseInMemoryDatabase")) return;
@@ -144,8 +175,8 @@ private static void WriteToNpgsql(LoggerConfiguration serilogConfig, string? con
144175
if (string.IsNullOrEmpty(connectionString)) return;
145176

146177
const string tableName = "loggers";
147-
//Used columns (Key is a column name)
148-
//Column type is writer's constructor parameter
178+
// Used columns (Key is a column name)
179+
// Column type is writer's constructor parameter
149180
IDictionary<string, ColumnWriterBase> columnOptions = new Dictionary<string, ColumnWriterBase>
150181
{
151182
{ "message", new RenderedMessageColumnWriter(NpgsqlDbType.Text) },
@@ -210,8 +241,8 @@ internal class UserInfoEnricher : ILogEventEnricher
210241
public UserInfoEnricher() : this(new HttpContextAccessor())
211242
{
212243
}
213-
//Dependency injection can be used to retrieve any service required to get a user or any data.
214-
//Here, I easily get data from HTTPContext
244+
// Dependency injection can be used to retrieve any service required to get a user or any data.
245+
// Here, I easily get data from HTTPContext
215246
public UserInfoEnricher(IHttpContextAccessor httpContextAccessor)
216247
{
217248
_httpContextAccessor = httpContextAccessor;

src/Infrastructure/Infrastructure.csproj

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
<LangVersion>default</LangVersion>
99
</PropertyGroup>
1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.AspNetCore.Authentication.Facebook" Version="9.0.0" />
12-
<PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="9.0.0" />
13-
<PackageReference Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="9.0.0" />
14-
<PackageReference Include="QuestPDF" Version="2025.1.0-alpha0" />
11+
<PackageReference Include="Microsoft.AspNetCore.Authentication.Facebook" Version="9.0.10" />
12+
<PackageReference Include="Microsoft.AspNetCore.Authentication.Google" Version="9.0.10" />
13+
<PackageReference Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="9.0.10" />
14+
<PackageReference Include="QuestPDF" Version="2025.7.4" />
1515
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
16-
<PackageReference Include="Serilog.Sinks.MSSqlServer" Version="8.1.1-dev-00120" />
17-
<PackageReference Include="Serilog.Sinks.Postgresql.Alternative" Version="4.1.3" />
16+
<PackageReference Include="Serilog.Sinks.MSSqlServer" Version="9.0.2" />
17+
<PackageReference Include="Serilog.Sinks.Postgresql.Alternative" Version="4.2.0" />
1818
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
19-
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
19+
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
2020
<PackageReference Include="Blazor.Serilog.Sinks.SQLite" Version="1.0.8" />
2121
<PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0" />
2222
</ItemGroup>

src/Server.UI/Components/Shared/Themes/ThemesMenu.razor

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,8 @@
145145
</MudItem>
146146

147147
</MudGrid>
148-
<MudText Typo="Typo.body2">
149-
<b>@L["Online Users"]</b>
150-
</MudText>
151-
<OnlineUsersTracker></OnlineUsersTracker>
148+
149+
152150
</div>
153151
</MudDrawer>
154152
<MudOverlay DarkBackground="true" Absolute="true"

src/Server.UI/Server.UI.csproj

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
<LangVersion>default</LangVersion>
1616
</PropertyGroup>
1717
<ItemGroup>
18-
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.17" />
18+
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.22" />
1919
<PackageReference Include="Hangfire.InMemory" Version="1.0.0" />
2020
<PackageReference Include="BlazorDownloadFile" Version="2.4.0.2" />
21-
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.6" />
22-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.0" />
23-
<PackageReference Include="MudBlazor" Version="8.0.0-preview.7" />
24-
<PackageReference Include="Toolbelt.Blazor.HotKeys2" Version="6.0.0" />
25-
<PackageReference Include="Blazor-ApexCharts" Version="5.0.0" />
26-
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.0">
21+
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" />
22+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.10" />
23+
<PackageReference Include="MudBlazor" Version="8.14.0" />
24+
<PackageReference Include="Toolbelt.Blazor.HotKeys2" Version="6.0.1" />
25+
<PackageReference Include="Blazor-ApexCharts" Version="6.0.2" />
26+
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.10">
2727
<PrivateAssets>all</PrivateAssets>
2828
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2929
</PackageReference>

0 commit comments

Comments
 (0)