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