一、核心组件与日志级别
1. 核心概念
-
日志级别:共6个等级,优先级从低到高为:
Trace
<Debug
<Information
<Warning
<Error
<Critical
可通过配置设置最低输出级别(如仅记录Warning
及以上)1610。 -
日志提供程序(Logger Provider):决定日志输出目标,如控制台、文件、数据库等36。
-
日志记录器(ILogger):通过依赖注入获取,支持泛型
ILogger<T>
,自动以类名作为日志类别106。
2. 内置提供程序
-
控制台:
AddConsole()
,开发环境常用26。 -
调试窗口:
AddDebug()
,输出到IDE调试面板3。 -
事件日志:
AddEventLog()
,仅Windows系统可用17。 -
文件输出:需借助第三方库(如NLog、Serilog)17。
二、配置与使用
1. 基础配置
-
通过代码配置:
services.AddLogging(builder => { builder.AddConsole() .SetMinimumLevel(LogLevel.Information); });
-
通过
appsettings.json
配置:{ "Logging": { "LogLevel": { "Default": "Warning", "Microsoft": "Error" }, "Console": { "LogLevel": "Debug" } } }
使用
AddConfiguration()
加载配置910。
2. 依赖注入使用
public class MyController : Controller {
private readonly ILogger<MyController> _logger;
public MyController(ILogger<MyController> logger) {
_logger = logger;
}
public IActionResult Get() {
_logger.LogInformation("请求处理开始");
// 业务逻辑
_logger.LogError(ex, "操作失败");
}
}
三、第三方日志框架
1. NLog
-
特点:支持滚动日志、文件大小限制、多目标输出17。
-
配置步骤:
-
安装
NLog.Extensions.Logging
包。 -
创建
nlog.config
文件,设置输出规则:<target name="file" xsi:type="File" fileName="logs/${shortdate}.log" archiveAboveSize="10485760" maxArchiveFiles="30" /> <rules> <logger name="*" minlevel="Info" writeTo="file" /> </rules>
-
注册服务:
services.AddLogging(builder => builder.AddNLog());
-
2. Serilog
-
特点:结构化日志、支持JSON格式、集成集中式日志服务(如ELK)
-
配置示例:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console(new JsonFormatter()) .WriteTo.Elasticsearch("http://elk-server:9200") .CreateLogger(); services.AddSerilog();
记录结构化数据:
logger.LogWarning("新增用户 {@User}", new { Id = 1, Name = "Alice" });
78。
四、高级应用技巧
1. 日志范围(Log Scope)
-
功能:为日志添加上下文信息(如事务ID、调用链)9。
-
using (_logger.BeginScope("事务ID: {TransactionId}", Guid.NewGuid())) { _logger.LogInformation("操作步骤1完成"); // 嵌套范围 using (_logger.BeginScope("用户: {UserId}", 123)) { _logger.LogError("权限验证失败"); } }
2. 性能优化
-
LoggerMessage模式:预编译日志委托,减少装箱操作:
private static readonly Action<ILogger, int, Exception> _userLoggedIn = LoggerMessage.Define<int>( LogLevel.Information, new EventId(1, "UserLogin"), "用户 {UserId} 登录成功"); public void LogUserLogin(int userId) { _userLoggedIn(_logger, userId, null); }
3. 集中式日志管理
-
ELK Stack:通过Serilog或NLog将日志发送到Elasticsearch,结合Kibana分析。
-
Exceptionless:开源错误跟踪平台,支持.NET Core集成17。
五、最佳实践
-
日志级别选择:
-
开发环境使用
Debug
,生产环境限制为Information
及以上610。 -
避免在生产环境记录敏感信息(如密码)6。
-
-
日志分类过滤:
-
通过配置为不同命名空间设置不同级别(如
"Microsoft": "Warning"
)9。
-
-
异步输出与资源管理:
-
确保程序结束时调用
Log.CloseAndFlush()
,避免日志丢失10。
-