自定义ILogger实现中获取Logger<Type>调用方类型的方法
在自定义ILogger实现中获取泛型类型标识的方法
在.NET的日志体系里,ILogger<T>的核心机制是通过**类别名称(Category Name)**传递泛型参数T的完整类型名。你可以通过以下步骤在自定义DbLogger中获取并使用这个类型标识:
1. 在LoggerProvider中接收类别名称
当你通过依赖注入获取ILogger<LoggerTesting.LoggerTest>时,框架会自动调用自定义ILoggerProvider的CreateLogger方法,并传入typeof(LoggerTesting.LoggerTest).FullName作为参数。你只需在这个方法里接收该值,传递给DbLogger实例:
public class DbLoggerProvider : ILoggerProvider { public ILogger CreateLogger(string categoryName) { // categoryName即为LoggerTesting.LoggerTest的完整类型名 return new DbLogger(categoryName); } public void Dispose() { // 实现资源释放逻辑 } }
2. 在DbLogger中存储并使用类型名
在DbLogger的构造函数中保存接收到的类别名称,后续写日志时直接用它替换原有的“应用名称”字段:
public class DbLogger : ILogger { private readonly string _sourceType; public DbLogger(string sourceType) { _sourceType = sourceType; } public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { // 用_sourceType作为日志的类型标识 string logContent = $"[{_sourceType}] {formatter(state, exception)}"; // 执行写入数据库的逻辑... } public bool IsEnabled(LogLevel logLevel) { // 根据需求实现日志级别判断逻辑 return true; } public IDisposable BeginScope<TState>(TState state) { // 如需支持日志范围,可在此实现,否则返回空 return null; } }
补充说明
如果是手动创建ILogger<T>实例而非通过DI,只需手动传入typeof(T).FullName到CreateLogger方法即可,逻辑和DI场景完全一致。
内容的提问来源于stack exchange,提问作者Gary Smith
相关产品推荐
相关产品推荐

