Browse Source

更新 .gitignore 文件,添加 X1.WebAPI.logs 忽略规则

feature/x1-web-request
root 1 week ago
parent
commit
09050de5e3
  1. 3
      .gitignore
  2. 9
      modify.md
  3. 33
      src/X1.WebAPI/Extensions/LoggingExtensions.cs
  4. 18
      src/X1.WebAPI/Program.cs
  5. 5
      src/X1.WebAPI/X1.WebAPI.csproj
  6. 8
      src/X1.WebAPI/appsettings.Development.json
  7. 6
      src/X1.WebAPI/appsettings.json
  8. 365
      src/X1.WebAPI/docs/Serilog-Guide.md
  9. 46
      src/X1.WebAPI/logs/app-20250726.log
  10. 51
      src/X1.WebAPI/serilog.Development.json
  11. 42
      src/X1.WebAPI/serilog.Production.json
  12. 51
      src/X1.WebAPI/serilog.json

3
.gitignore

@ -42,3 +42,6 @@ artifacts/
# Node modules
node_modules/
# Logs
X1.WebAPI.logs/

9
modify.md

@ -423,3 +423,12 @@ if (IsMessageTimeout(messageStartTime))
- 资源能够及时释放
**建议保留超时机制**,但可以根据实际业务需求调整超时时间,或者实现更智能的心跳机制。
## 2024-12-19 - .gitignore 文件更新
- **修改内容**:将 `X1.WebAPI.logs/` 添加到 `.gitignore` 文件中
- **修改位置**:在 `# Node modules` 部分后添加了 `# Logs` 部分
- **修改原因**:避免将日志文件提交到版本控制系统
- **修改效果**
- ✅ 日志文件不会被 Git 跟踪
- ✅ 避免日志文件占用版本控制空间
- ✅ 保持代码仓库的整洁

33
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;
/// <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;
}
}

18
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();
// 注册基础设施层服务
// 包括数据库连接、缓存、日志等基础设施相关服务

5
src/X1.WebAPI/X1.WebAPI.csproj

@ -17,6 +17,11 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="3.0.1" />
<PackageReference Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.8" />
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.5.0" />

8
src/X1.WebAPI/appsettings.Development.json

@ -1,8 +1,4 @@
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft.AspNetCore": "Information"
}
}
"DetailedErrors": true
}

6
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,

365
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 的优势,为应用提供企业级的日志记录能力。

46
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

51
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"]
}
}

42
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"]
}
}

51
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"]
}
}
Loading…
Cancel
Save