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": { |
|||
"LogLevel": { |
|||
"Default": "Trace", |
|||
"Microsoft.AspNetCore": "Information" |
|||
} |
|||
} |
|||
"DetailedErrors": true |
|||
} |
|||
|
|||
|
@ -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