12 changed files with 616 additions and 25 deletions
@ -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; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// 日志配置扩展类 - 使用 Serilog 最优配置
|
||||
|
/// </summary>
|
||||
|
public static class LoggingExtensions |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 配置应用程序日志 - 使用 Serilog
|
||||
|
/// </summary>
|
||||
|
/// <param name="builder">Web应用程序构建器</param>
|
||||
|
/// <returns>Web应用程序构建器</returns>
|
||||
|
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; |
||||
|
} |
||||
|
} |
@ -1,8 +1,4 @@ |
|||||
{ |
{ |
||||
"Logging": { |
"DetailedErrors": true |
||||
"LogLevel": { |
|
||||
"Default": "Trace", |
|
||||
"Microsoft.AspNetCore": "Information" |
|
||||
} |
|
||||
} |
|
||||
} |
} |
||||
|
|
||||
|
@ -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 的优势,为应用提供企业级的日志记录能力。 |
@ -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 |
@ -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"] |
||||
|
} |
||||
|
} |
@ -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"] |
||||
|
} |
||||
|
} |
@ -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"] |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue