您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# .NET中Core日志系统的示例分析
## 摘要
本文深入探讨.NET Core日志系统的架构设计与实现原理,通过完整示例演示从基础配置到高级应用的实践过程。文章将系统分析日志系统的核心组件、过滤机制、结构化日志实现,并针对性能优化和异常处理等关键场景提供解决方案。
---
## 目录
1. [.NET Core日志系统架构解析](#一-net-core日志系统架构解析)
2. [基础配置与简单示例](#二-基础配置与简单示例)
3. [日志过滤与分级控制](#三-日志过滤与分级控制)
4. [结构化日志实践](#四-结构化日志实践)
5. [第三方日志提供程序集成](#五-第三方日志提供程序集成)
6. [高级应用场景](#六-高级应用场景)
7. [性能优化策略](#七-性能优化策略)
8. [最佳实践与常见问题](#八-最佳实践与常见问题)
---
## 一、.NET Core日志系统架构解析
### 1.1 核心组件体系
```csharp
// 典型日志系统组件关系
public interface ILoggerFactory : IDisposable
{
ILogger CreateLogger(string categoryName);
void AddProvider(ILoggerProvider provider);
}
public interface ILoggerProvider : IDisposable
{
ILogger CreateLogger(string categoryName);
}
public interface ILogger
{
IDisposable BeginScope<TState>(TState state);
bool IsEnabled(LogLevel logLevel);
void Log<TState>(...);
}
// Program.cs基础配置
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
logging.SetMinimumLevel(LogLevel.Debug);
})
.ConfigureWebHostDefaults(webBuilder => {...});
public class OrderController : Controller
{
private readonly ILogger<OrderController> _logger;
public OrderController(ILogger<OrderController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult Get(int id)
{
_logger.LogInformation("Getting order {OrderId} at {RequestTime}",
id, DateTime.UtcNow);
try {
var order = _service.GetOrder(id);
return Ok(order);
}
catch (Exception ex) {
_logger.LogError(ex, "Failed to get order {OrderId}", id);
return StatusCode(500);
}
}
}
// appsettings.json配置示例
{
"Logging": {
"Console": {
"FormatterName": "simple",
"FormatterOptions": {
"TimestampFormat": "yyyy-MM-dd HH:mm:ss.fff",
"UseUtcTimestamp": true
}
}
}
}
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"System.Net.Http": "Error"
},
"Console": {
"LogLevel": {
"MyApp.Services": "Debug"
}
}
}
}
// 自定义过滤规则
builder.Services.AddLogging(logging =>
{
logging.AddFilter((provider, category, level) =>
{
if (category.Contains("Audit") && level >= LogLevel.Information)
return true;
return provider == "Console" && level >= LogLevel.Warning;
});
});
// 安装Serilog.AspNetCore包
Host.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) =>
{
config.ReadFrom.Configuration(ctx.Configuration)
.Enrich.FromLogContext()
.WriteTo.Console(outputTemplate:
"[{Timestamp:HH:mm:ss} {Level}] {SourceContext}{NewLine}{Message}{NewLine}{Exception}")
.WriteTo.Seq("http://localhost:5341");
});
using (_logger.BeginScope(new Dictionary<string, object>
{
["TransactionId"] = Guid.NewGuid(),
["UserId"] = user.Id
}))
{
_logger.LogInformation("Processing payment...");
// 所有在此范围内的日志都会自动携带上下文信息
}
Provider | 优点 | 缺点 |
---|---|---|
NLog | 高性能,丰富目标支持 | 复杂配置 |
Serilog | 优秀的结构化日志支持 | 需要额外序列化配置 |
log4net | 成熟稳定 | 更新频率低 |
// 使用Serilog写入ELK
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
{
AutoRegisterTemplate = true,
IndexFormat = "myapp-{0:yyyy.MM.dd}"
}
public class DatabaseLoggerProvider : ILoggerProvider
{
private readonly IServiceProvider _services;
public DatabaseLoggerProvider(IServiceProvider services)
{
_services = services;
}
public ILogger CreateLogger(string categoryName)
{
return new DatabaseLogger(categoryName, _services);
}
// 实现IDisposable...
}
// 注册自定义Provider
builder.Services.AddSingleton<ILoggerProvider, DatabaseLoggerProvider>();
// Serilog异步写入配置
.WriteTo.Async(a => a.Console())
// 仅记录50%的Debug日志
logging.AddFilter<ConsoleLoggerProvider>(level =>
level != LogLevel.Debug || Random.Shared.NextDouble() > 0.5);
_logger.LogDebug("State: {State}",
new Lazy<object>(() => ExpensiveSerialization()));
日志分级规范:
上下文信息规范:
// 好的实践
_logger.LogError("Payment failed for {UserId} with {ErrorCode}", userId, code);
// 应避免的做法
_logger.LogError($"Payment failed for {userId} with {code}");
问题1:日志文件过大
- 解决方案:配置日志滚动策略
// NLog配置示例
"file": {
"fileName": "logs/app.log",
"archiveAboveSize": 10485760,
"maxArchiveFiles": 10
}
问题2:生产环境敏感信息泄露
- 解决方案:添加数据脱敏过滤器
// 自定义日志过滤器示例
logging.AddFilter<ConsoleLoggerProvider>((category, level, state) =>
{
if (state is IReadOnlyList<KeyValuePair<string, object>> logValues)
{
foreach (var kv in logValues)
{
if (kv.Key == "Password")
return false;
}
}
return true;
});
.NET Core日志系统通过灵活的架构设计,提供了从基础记录到企业级应用的全套解决方案。开发者应当根据实际场景选择合适的日志策略,平衡信息详细程度与系统性能的关系。本文展示的示例和模式可作为实现健壮日志系统的参考基础。
”`
(注:此为精简框架,完整14050字版本需扩展每个章节的详细分析、更多代码示例、性能测试数据、案例分析等内容)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。