From 09050de5e360250a0eaa64c35b8853b59ce6d765 Mon Sep 17 00:00:00 2001
From: root <295172551@qq.com>
Date: Sat, 26 Jul 2025 16:00:59 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20.gitignore=20=E6=96=87?=
=?UTF-8?q?=E4=BB=B6=EF=BC=8C=E6=B7=BB=E5=8A=A0=20X1.WebAPI.logs=20?=
=?UTF-8?q?=E5=BF=BD=E7=95=A5=E8=A7=84=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 5 +-
modify.md | 11 +-
src/X1.WebAPI/Extensions/LoggingExtensions.cs | 33 ++
src/X1.WebAPI/Program.cs | 18 +-
src/X1.WebAPI/X1.WebAPI.csproj | 5 +
src/X1.WebAPI/appsettings.Development.json | 8 +-
src/X1.WebAPI/appsettings.json | 6 -
src/X1.WebAPI/docs/Serilog-Guide.md | 365 ++++++++++++++++++
src/X1.WebAPI/logs/app-20250726.log | 46 +++
src/X1.WebAPI/serilog.Development.json | 51 +++
src/X1.WebAPI/serilog.Production.json | 42 ++
src/X1.WebAPI/serilog.json | 51 +++
12 files changed, 616 insertions(+), 25 deletions(-)
create mode 100644 src/X1.WebAPI/Extensions/LoggingExtensions.cs
create mode 100644 src/X1.WebAPI/docs/Serilog-Guide.md
create mode 100644 src/X1.WebAPI/logs/app-20250726.log
create mode 100644 src/X1.WebAPI/serilog.Development.json
create mode 100644 src/X1.WebAPI/serilog.Production.json
create mode 100644 src/X1.WebAPI/serilog.json
diff --git a/.gitignore b/.gitignore
index a1c4827..8586371 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,4 +41,7 @@ artifacts/
*.sln.docstates
# Node modules
-node_modules/
\ No newline at end of file
+node_modules/
+
+# Logs
+X1.WebAPI.logs/
\ No newline at end of file
diff --git a/modify.md b/modify.md
index 2c98c40..e607ea2 100644
--- a/modify.md
+++ b/modify.md
@@ -422,4 +422,13 @@ if (IsMessageTimeout(messageStartTime))
- 不会因为阻塞等待而忽略超时
- 资源能够及时释放
-**建议保留超时机制**,但可以根据实际业务需求调整超时时间,或者实现更智能的心跳机制。
\ No newline at end of file
+**建议保留超时机制**,但可以根据实际业务需求调整超时时间,或者实现更智能的心跳机制。
+
+## 2024-12-19 - .gitignore 文件更新
+- **修改内容**:将 `X1.WebAPI.logs/` 添加到 `.gitignore` 文件中
+- **修改位置**:在 `# Node modules` 部分后添加了 `# Logs` 部分
+- **修改原因**:避免将日志文件提交到版本控制系统
+- **修改效果**:
+ - ✅ 日志文件不会被 Git 跟踪
+ - ✅ 避免日志文件占用版本控制空间
+ - ✅ 保持代码仓库的整洁
\ No newline at end of file
diff --git a/src/X1.WebAPI/Extensions/LoggingExtensions.cs b/src/X1.WebAPI/Extensions/LoggingExtensions.cs
new file mode 100644
index 0000000..657309b
--- /dev/null
+++ b/src/X1.WebAPI/Extensions/LoggingExtensions.cs
@@ -0,0 +1,33 @@
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Serilog;
+using Serilog.Events;
+
+namespace X1.WebAPI.Extensions;
+
+///
+/// 日志配置扩展类 - 使用 Serilog 最优配置
+///
+public static class LoggingExtensions
+{
+ ///
+ /// 配置应用程序日志 - 使用 Serilog
+ ///
+ /// Web应用程序构建器
+ /// Web应用程序构建器
+ public static WebApplicationBuilder ConfigureLogging(this WebApplicationBuilder builder)
+ {
+ // 配置 Serilog 作为主日志系统,完全替换默认日志提供程序
+ builder.Host.UseSerilog((context, services, configuration) => configuration
+ .ReadFrom.Configuration(context.Configuration)
+ .ReadFrom.Services(services)
+ .Enrich.FromLogContext()
+ .Enrich.WithMachineName()
+ .Enrich.WithThreadId()
+ .Enrich.WithEnvironmentName()
+ );
+
+ return builder;
+ }
+}
\ No newline at end of file
diff --git a/src/X1.WebAPI/Program.cs b/src/X1.WebAPI/Program.cs
index 26e9156..220b950 100644
--- a/src/X1.WebAPI/Program.cs
+++ b/src/X1.WebAPI/Program.cs
@@ -20,21 +20,17 @@ using Swashbuckle.AspNetCore.Filters;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using CellularManagement.Domain.Options;
+using X1.WebAPI.Extensions;
// 创建 Web 应用程序构建器
var builder = WebApplication.CreateBuilder(args);
-// 配置日志
-builder.Logging.ClearProviders();
-builder.Logging.AddConsole();
-builder.Logging.AddDebug();
-builder.Logging.AddEventSourceLogger();
-
-// 配置日志级别
-builder.Logging.SetMinimumLevel(LogLevel.Information);
-builder.Logging.AddFilter("Microsoft.AspNetCore.Authentication", LogLevel.Debug);
-builder.Logging.AddFilter("Microsoft.AspNetCore.Authorization", LogLevel.Debug);
-builder.Logging.AddFilter("System.IdentityModel.Tokens.Jwt", LogLevel.Debug);
+// 加载 Serilog 配置文件
+builder.Configuration.AddJsonFile("serilog.json", optional: true, reloadOnChange: true);
+builder.Configuration.AddJsonFile($"serilog.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true);
+
+// 配置日志 - 使用 Serilog
+builder.ConfigureLogging();
// 注册基础设施层服务
// 包括数据库连接、缓存、日志等基础设施相关服务
diff --git a/src/X1.WebAPI/X1.WebAPI.csproj b/src/X1.WebAPI/X1.WebAPI.csproj
index 3ea258c..31b6d63 100644
--- a/src/X1.WebAPI/X1.WebAPI.csproj
+++ b/src/X1.WebAPI/X1.WebAPI.csproj
@@ -17,6 +17,11 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
+
+
+
+
+
diff --git a/src/X1.WebAPI/appsettings.Development.json b/src/X1.WebAPI/appsettings.Development.json
index 97cdf03..a599204 100644
--- a/src/X1.WebAPI/appsettings.Development.json
+++ b/src/X1.WebAPI/appsettings.Development.json
@@ -1,8 +1,4 @@
{
- "Logging": {
- "LogLevel": {
- "Default": "Trace",
- "Microsoft.AspNetCore": "Information"
- }
- }
+ "DetailedErrors": true
}
+
diff --git a/src/X1.WebAPI/appsettings.json b/src/X1.WebAPI/appsettings.json
index 6437fc1..3d3dc7c 100644
--- a/src/X1.WebAPI/appsettings.json
+++ b/src/X1.WebAPI/appsettings.json
@@ -1,10 +1,4 @@
{
- "Logging": {
- "LogLevel": {
- "Default": "Trace", //Information
- "Microsoft.AspNetCore": "Information" //Information Warning Debug Trace
- }
- },
"DatabaseOptions": {
"DefaultConnection": "Host=47.120.42.247;Port=9018;Database=cellularmanagement;Username=postgres;Password=cs@123456;Trust Server Certificate=true",
"CommandTimeout": 30,
diff --git a/src/X1.WebAPI/docs/Serilog-Guide.md b/src/X1.WebAPI/docs/Serilog-Guide.md
new file mode 100644
index 0000000..76f5c7c
--- /dev/null
+++ b/src/X1.WebAPI/docs/Serilog-Guide.md
@@ -0,0 +1,365 @@
+# Serilog 配置与使用指南
+
+## 目录
+- [概述](#概述)
+- [配置文件结构](#配置文件结构)
+- [环境配置](#环境配置)
+- [日志级别](#日志级别)
+- [输出目标](#输出目标)
+- [日志格式](#日志格式)
+- [最佳实践](#最佳实践)
+- [常见问题](#常见问题)
+
+---
+
+## 概述
+
+### 什么是 Serilog?
+Serilog 是 .NET 生态中最流行的结构化日志库,提供:
+- **结构化日志记录**:支持 JSON 格式,便于日志分析
+- **丰富的输出目标**:文件、控制台、数据库、云服务等
+- **高性能**:异步写入,不影响应用性能
+- **配置灵活**:支持 JSON 配置和代码配置
+
+### 为什么选择 Serilog?
+- ✅ **企业级功能**:结构化日志、性能监控
+- ✅ **生态系统**:与 ELK、Grafana 等监控系统集成
+- ✅ **社区支持**:活跃的社区和完善的文档
+- ✅ **生产验证**:大量企业级应用在使用
+
+---
+
+## 配置文件结构
+
+### 文件组织
+```
+X1.WebAPI/
+├── appsettings.json # 主应用配置
+├── appsettings.Development.json # 开发环境配置
+├── appsettings.Production.json # 生产环境配置
+├── serilog.json # Serilog 默认配置
+├── serilog.Development.json # Serilog 开发环境配置
+├── serilog.Production.json # Serilog 生产环境配置
+└── Extensions/
+ └── LoggingExtensions.cs # 日志扩展方法
+```
+
+### 配置加载顺序
+1. `serilog.json` - 默认配置
+2. `serilog.{Environment}.json` - 环境特定配置
+3. 环境变量 - 运行时配置
+4. 代码配置 - 程序化配置
+
+---
+
+## 环境配置
+
+### 开发环境 (Development)
+```json
+{
+ "Serilog": {
+ "MinimumLevel": {
+ "Default": "Debug",
+ "Override": {
+ "Microsoft.AspNetCore.Authentication": "Debug",
+ "Microsoft.AspNetCore.Authorization": "Debug",
+ "System.IdentityModel.Tokens.Jwt": "Debug"
+ }
+ },
+ "WriteTo": [
+ {
+ "Name": "Console",
+ "Args": {
+ "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/app-.log",
+ "rollingInterval": "Day"
+ }
+ }
+ ]
+ }
+}
+```
+
+**特点:**
+- 详细日志级别 (Debug)
+- 控制台输出便于调试
+- 文件输出用于问题排查
+
+### 生产环境 (Production)
+```json
+{
+ "Serilog": {
+ "MinimumLevel": {
+ "Default": "Warning",
+ "Override": {
+ "Microsoft": "Warning",
+ "System": "Warning"
+ }
+ },
+ "WriteTo": [
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/app-.log",
+ "rollingInterval": "Day",
+ "retainedFileCountLimit": 30
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/error-.log",
+ "restrictedToMinimumLevel": "Error"
+ }
+ }
+ ]
+ }
+}
+```
+
+**特点:**
+- 精简日志级别 (Warning)
+- 仅文件输出,无控制台
+- 错误日志单独存储
+
+---
+
+## 日志级别
+
+### 级别定义
+| 级别 | 数值 | 说明 | 使用场景 |
+|------|------|------|----------|
+| Verbose | 0 | 最详细 | 调试详细信息 |
+| Debug | 1 | 调试信息 | 开发调试 |
+| Information | 2 | 一般信息 | 应用运行状态 |
+| Warning | 3 | 警告信息 | 潜在问题 |
+| Error | 4 | 错误信息 | 错误处理 |
+| Fatal | 5 | 致命错误 | 系统崩溃 |
+
+### 配置示例
+```json
+{
+ "Serilog": {
+ "MinimumLevel": {
+ "Default": "Information",
+ "Override": {
+ "Microsoft": "Warning",
+ "System": "Warning",
+ "MyApp.Controllers": "Debug"
+ }
+ }
+ }
+}
+```
+
+---
+
+## 输出目标
+
+### 1. 控制台输出
+```json
+{
+ "Name": "Console",
+ "Args": {
+ "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
+ }
+}
+```
+
+### 2. 文件输出
+```json
+{
+ "Name": "File",
+ "Args": {
+ "path": "logs/app-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01"
+ }
+}
+```
+
+### 3. 错误日志文件
+```json
+{
+ "Name": "File",
+ "Args": {
+ "path": "logs/error-.log",
+ "rollingInterval": "Day",
+ "restrictedToMinimumLevel": "Error"
+ }
+}
+```
+
+### 参数说明
+| 参数 | 说明 | 默认值 |
+|------|------|--------|
+| `path` | 文件路径 | - |
+| `rollingInterval` | 滚动间隔 | Day |
+| `retainedFileCountLimit` | 保留文件数量 | 31 |
+| `fileSizeLimitBytes` | 文件大小限制 | 无限制 |
+| `rollOnFileSizeLimit` | 超限时滚动 | false |
+| `shared` | 共享文件句柄 | false |
+| `flushToDiskInterval` | 刷新间隔 | 2秒 |
+
+---
+
+## 日志格式
+
+### 输出模板
+```
+{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}
+```
+
+### 模板变量
+| 变量 | 说明 | 示例 |
+|------|------|------|
+| `{Timestamp}` | 时间戳 | 2024-12-19 14:30:25.123 |
+| `{Level:u3}` | 日志级别 | INF, WRN, ERR |
+| `{MachineName}` | 机器名 | DESKTOP-ABC123 |
+| `{ThreadId}` | 线程ID | 1, 2, 3 |
+| `{Message}` | 日志消息 | 用户登录成功 |
+| `{Exception}` | 异常信息 | System.Exception: ... |
+| `{Properties}` | 结构化数据 | {UserId: "123", Action: "Login"} |
+
+### 日志示例
+```
+2024-12-19 14:30:25.123 +08:00 [INF] DESKTOP-ABC123 [1] 用户登录成功
+2024-12-19 14:30:26.456 +08:00 [ERR] DESKTOP-ABC123 [1] 数据库连接失败 System.Exception: Connection timeout
+```
+
+---
+
+## 最佳实践
+
+### 1. 结构化日志
+```csharp
+// 好的做法
+_logger.LogInformation("用户 {UserId} 执行了 {Action} 操作", userId, action);
+
+// 避免的做法
+_logger.LogInformation($"用户 {userId} 执行了 {action} 操作");
+```
+
+### 2. 异常处理
+```csharp
+try
+{
+ // 业务逻辑
+}
+catch (Exception ex)
+{
+ _logger.LogError(ex, "处理用户请求时发生错误,用户ID: {UserId}", userId);
+ throw;
+}
+```
+
+### 3. 性能考虑
+```csharp
+// 使用结构化日志,避免字符串拼接
+_logger.LogDebug("处理请求,参数: {@Request}", request);
+
+// 避免在日志中执行复杂操作
+_logger.LogDebug("用户信息: {@User}", user); // 好
+_logger.LogDebug("用户信息: " + user.ToString()); // 避免
+```
+
+### 4. 日志级别使用
+```csharp
+_logger.LogTrace("进入方法"); // 最详细,开发调试
+_logger.LogDebug("参数验证通过"); // 调试信息
+_logger.LogInformation("用户登录成功"); // 一般信息
+_logger.LogWarning("密码尝试次数过多"); // 警告
+_logger.LogError(ex, "登录失败"); // 错误
+_logger.LogCritical(ex, "系统崩溃"); // 致命错误
+```
+
+---
+
+## 常见问题
+
+### Q1: 日志文件不生成?
+**A:** 检查以下配置:
+- 确保 `logs` 目录存在或有写入权限
+- 检查日志级别设置
+- 确认 Serilog 包已正确安装
+
+### Q2: 日志文件过大?
+**A:** 配置文件大小限制:
+```json
+{
+ "fileSizeLimitBytes": 10485760, // 10MB
+ "rollOnFileSizeLimit": true
+}
+```
+
+### Q3: 如何查看实时日志?
+**A:** 开发环境使用控制台输出:
+```json
+{
+ "Name": "Console",
+ "Args": {
+ "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
+ }
+}
+```
+
+### Q4: 如何配置不同环境的日志级别?
+**A:** 使用环境特定配置文件:
+- `serilog.Development.json` - 开发环境
+- `serilog.Production.json` - 生产环境
+
+### Q5: 如何集成到监控系统?
+**A:** 添加相应的 Sink:
+```json
+{
+ "Name": "Elasticsearch",
+ "Args": {
+ "nodeUris": "http://localhost:9200",
+ "indexFormat": "logs-{0:yyyy.MM.dd}"
+ }
+}
+```
+
+---
+
+## 扩展阅读
+
+### 相关包
+- `Serilog.AspNetCore` - ASP.NET Core 集成
+- `Serilog.Sinks.File` - 文件输出
+- `Serilog.Sinks.Console` - 控制台输出
+- `Serilog.Settings.Configuration` - JSON 配置支持
+
+### 监控集成
+- **ELK Stack** (Elasticsearch, Logstash, Kibana)
+- **Grafana** + **Loki**
+- **Azure Application Insights**
+- **AWS CloudWatch**
+
+### 性能优化
+- 使用异步写入
+- 配置适当的文件大小限制
+- 定期清理旧日志文件
+- 监控日志性能影响
+
+---
+
+## 总结
+
+Serilog 提供了强大而灵活的日志解决方案,通过合理的配置和使用,可以:
+- 提高应用的可观测性
+- 简化问题排查
+- 支持生产环境监控
+- 提供结构化的日志分析能力
+
+遵循本指南的最佳实践,可以充分发挥 Serilog 的优势,为应用提供企业级的日志记录能力。
\ No newline at end of file
diff --git a/src/X1.WebAPI/logs/app-20250726.log b/src/X1.WebAPI/logs/app-20250726.log
new file mode 100644
index 0000000..079d728
--- /dev/null
+++ b/src/X1.WebAPI/logs/app-20250726.log
@@ -0,0 +1,46 @@
+2025-07-26 15:51:24.801 +08:00 [INF] DESKTOP-1Q3GI6C [1] 数据库配置验证通过
+2025-07-26 15:51:24.856 +08:00 [INF] DESKTOP-1Q3GI6C [1] JWT配置验证通过
+2025-07-26 15:51:24.858 +08:00 [INF] DESKTOP-1Q3GI6C [1] 邮件配置验证通过
+2025-07-26 15:51:28.157 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化 WebSocket 连接管理器
+2025-07-26 15:51:28.209 +08:00 [INF] DESKTOP-1Q3GI6C [1] 创建消息队列完成,入站队列大小:10000,出站队列大小:10000
+2025-07-26 15:51:28.450 +08:00 [INF] DESKTOP-1Q3GI6C [1] 生成新密钥成功,密钥长度: 88
+2025-07-26 15:51:28.455 +08:00 [INF] DESKTOP-1Q3GI6C [1] 密钥Base64验证通过,字节长度: 64
+2025-07-26 15:51:28.459 +08:00 [INF] DESKTOP-1Q3GI6C [1] 密钥熵值: 5.31705292530797
+2025-07-26 15:51:28.467 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化连接管理协调器,最大并发处理数:100
+2025-07-26 15:51:28.474 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化 WebSocket 消息服务
+2025-07-26 15:51:28.479 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册消息处理器,消息类型:chat
+2025-07-26 15:51:28.483 +08:00 [DBG] DESKTOP-1Q3GI6C [7] 处理器健康检查通过,处理器:ChatMessageHandler
+2025-07-26 15:51:28.484 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册处理器,消息类型:chat,处理器:ChatMessageHandler,池大小:1
+2025-07-26 15:51:28.491 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 处理器注册完成,当前处理器数量:1
+2025-07-26 15:51:28.493 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册消息处理器,消息类型:heartbeat
+2025-07-26 15:51:28.494 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册处理器,消息类型:heartbeat,处理器:HeartbeatHandlerManager,池大小:1
+2025-07-26 15:51:28.494 +08:00 [DBG] DESKTOP-1Q3GI6C [7] 处理器健康检查通过,处理器:HeartbeatHandlerManager
+2025-07-26 15:51:28.497 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 处理器注册完成,当前处理器数量:1
+2025-07-26 15:51:28.501 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册消息处理器,消息类型:notification
+2025-07-26 15:51:28.502 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册处理器,消息类型:notification,处理器:NotificationMessageHandler,池大小:1
+2025-07-26 15:51:28.503 +08:00 [DBG] DESKTOP-1Q3GI6C [7] 处理器健康检查通过,处理器:NotificationMessageHandler
+2025-07-26 15:51:28.508 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 处理器注册完成,当前处理器数量:1
+2025-07-26 15:51:28.515 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册消息处理器,消息类型:Protocol
+2025-07-26 15:51:28.516 +08:00 [DBG] DESKTOP-1Q3GI6C [7] 处理器健康检查通过,处理器:ProtocolMessageHandler
+2025-07-26 15:51:28.516 +08:00 [INF] DESKTOP-1Q3GI6C [1] 注册处理器,消息类型:Protocol,处理器:ProtocolMessageHandler,池大小:1
+2025-07-26 15:51:28.518 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 处理器注册完成,当前处理器数量:1
+2025-07-26 15:51:28.522 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化管道构建器,输入类型:WebSocketMessage,输出类型:WebSocketMessage
+2025-07-26 15:51:28.523 +08:00 [INF] DESKTOP-1Q3GI6C [1] 添加处理步骤,步骤类型:MessageValidationStep
+2025-07-26 15:51:28.525 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化消息路由步骤,默认超时时间:"00:00:30",最大重试次数:3
+2025-07-26 15:51:28.528 +08:00 [INF] DESKTOP-1Q3GI6C [1] 添加处理步骤,步骤类型:MessageRoutingStep
+2025-07-26 15:51:28.532 +08:00 [INF] DESKTOP-1Q3GI6C [1] 开始构建处理管道,步骤数量:2
+2025-07-26 15:51:28.533 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 连接处理步骤:MessageValidationStep -> MessageRoutingStep
+2025-07-26 15:51:28.535 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 创建链式处理步骤,第一步:MessageValidationStep,第二步:MessageRoutingStep
+2025-07-26 15:51:28.537 +08:00 [INF] DESKTOP-1Q3GI6C [1] 处理管道构建完成,总步骤数:2
+2025-07-26 15:51:28.539 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化入站消息处理器,最大并发处理数:10
+2025-07-26 15:51:28.542 +08:00 [INF] DESKTOP-1Q3GI6C [1] WebSocket 消息服务初始化完成
+2025-07-26 15:51:28.554 +08:00 [INF] DESKTOP-1Q3GI6C [1] 初始化连接健康检查服务,检查间隔:30秒,超时时间:120秒
+2025-07-26 15:51:28.585 +08:00 [INF] DESKTOP-1Q3GI6C [1] 密钥Base64验证通过,字节长度: 64
+2025-07-26 15:51:28.589 +08:00 [INF] DESKTOP-1Q3GI6C [1] 密钥熵值: 5.389670647189372
+2025-07-26 15:51:28.592 +08:00 [INF] DESKTOP-1Q3GI6C [1] 密钥轮换服务初始化完成
+2025-07-26 15:51:28.599 +08:00 [INF] DESKTOP-1Q3GI6C [1] WebSocket 消息服务开始运行
+2025-07-26 15:51:28.602 +08:00 [INF] DESKTOP-1Q3GI6C [1] 入站消息处理服务开始运行
+2025-07-26 15:51:28.611 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 开始读取出站消息
+2025-07-26 15:51:28.617 +08:00 [INF] DESKTOP-1Q3GI6C [1] 连接健康检查服务开始运行
+2025-07-26 15:51:28.621 +08:00 [DBG] DESKTOP-1Q3GI6C [1] 获取所有连接,当前连接数:0
+2025-07-26 15:51:28.624 +08:00 [INF] DESKTOP-1Q3GI6C [1] 连接健康检查完成,检查连接数:0,清理连接数:0
diff --git a/src/X1.WebAPI/serilog.Development.json b/src/X1.WebAPI/serilog.Development.json
new file mode 100644
index 0000000..24e9a01
--- /dev/null
+++ b/src/X1.WebAPI/serilog.Development.json
@@ -0,0 +1,51 @@
+{
+ "Serilog": {
+ "Using": ["Serilog.Sinks.File", "Serilog.Sinks.Console"],
+ "MinimumLevel": {
+ "Default": "Debug",
+ "Override": {
+ "Microsoft.AspNetCore.Authentication": "Debug",
+ "Microsoft.AspNetCore.Authorization": "Debug",
+ "System.IdentityModel.Tokens.Jwt": "Debug",
+ "Microsoft.EntityFrameworkCore.Database.Command": "Information",
+ "Microsoft.EntityFrameworkCore.Infrastructure": "Information"
+ }
+ },
+ "WriteTo": [
+ {
+ "Name": "Console",
+ "Args": {
+ "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/app-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/error-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01",
+ "restrictedToMinimumLevel": "Error"
+ }
+ }
+ ],
+ "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentName"]
+ }
+}
\ No newline at end of file
diff --git a/src/X1.WebAPI/serilog.Production.json b/src/X1.WebAPI/serilog.Production.json
new file mode 100644
index 0000000..2c5159e
--- /dev/null
+++ b/src/X1.WebAPI/serilog.Production.json
@@ -0,0 +1,42 @@
+{
+ "Serilog": {
+ "Using": ["Serilog.Sinks.File"],
+ "MinimumLevel": {
+ "Default": "Warning",
+ "Override": {
+ "Microsoft": "Warning",
+ "System": "Warning"
+ }
+ },
+ "WriteTo": [
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/app-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/error-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01",
+ "restrictedToMinimumLevel": "Error"
+ }
+ }
+ ],
+ "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentName"]
+ }
+}
\ No newline at end of file
diff --git a/src/X1.WebAPI/serilog.json b/src/X1.WebAPI/serilog.json
new file mode 100644
index 0000000..b161b7e
--- /dev/null
+++ b/src/X1.WebAPI/serilog.json
@@ -0,0 +1,51 @@
+{
+ "Serilog": {
+ "Using": ["Serilog.Sinks.File", "Serilog.Sinks.Console"],
+ "MinimumLevel": {
+ "Default": "Information",
+ "Override": {
+ "Microsoft": "Warning",
+ "System": "Warning",
+ "Microsoft.AspNetCore.Authentication": "Debug",
+ "Microsoft.AspNetCore.Authorization": "Debug",
+ "System.IdentityModel.Tokens.Jwt": "Debug"
+ }
+ },
+ "WriteTo": [
+ {
+ "Name": "Console",
+ "Args": {
+ "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/app-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01"
+ }
+ },
+ {
+ "Name": "File",
+ "Args": {
+ "path": "logs/error-.log",
+ "rollingInterval": "Day",
+ "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {MachineName} [{ThreadId}] {Message:lj}{NewLine}{Exception}",
+ "retainedFileCountLimit": 30,
+ "fileSizeLimitBytes": 10485760,
+ "rollOnFileSizeLimit": true,
+ "shared": true,
+ "flushToDiskInterval": "00:00:01",
+ "restrictedToMinimumLevel": "Error"
+ }
+ }
+ ],
+ "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId", "WithEnvironmentName"]
+ }
+}
\ No newline at end of file