You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:22:04