2
asp.net 코어에서 수행 한 모든 로그에 테넌트 이름을 추가하려고합니다. 멀티 인 경우 Sasskit을 사용합니다.MultiTenant 사용자 정의 ILogger - 단일 범위에서 범위 서비스를 사용할 수 없습니다
일부 범위 문제가 발생했습니다. 나는 내가이 작업을 얻을 수있는 방법에 대한 몇 가지 의견을 싶습니다
이 내 사용자 정의 로거 :
public class MultiTenantLogger : IMultiTenantProvider
{
private AppTenant _tenant;
public MultiTenantLogger(AppTenant tenant)
{
_tenant = tenant;
}
public string GetTenantName<T>()
{
var typeDisplayName = GetTypeDisplayName(typeof(T));
if (_tenant == null)
{
return typeDisplayName;
}
return $"Tenant: {_tenant.Name}";
}
}
.
public void ConfigureServices(IServiceCollection services)
{
_services = services;
services.AddMultitenancy<AppTenant, CachingAppTenantResolver>();
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.Configure<MultitenancyOptions>(Configuration.GetSection("Multitenancy"));
services.AddMvc();
services.AddTransient<IMultiTenantProvider, MultiTenantLogger>();
services.Replace(ServiceDescriptor.Transient(typeof(ILogger<>), typeof(MultiTenantLogger<>)));
}
는이 오류를 얻을 :
Cannot consume scoped service 'AspNetMvcSampleModels.AppTenant' from singleton 'Microsoft.AspNetCore.Hosting.IApplicationLifetime'.
이 작업을하는 방법에 대한 모든 의견을 환영합니다
public class MultiTenantLogger<T> : ILogger<T>
{
private readonly ILogger _logger;
public MultiTenantLogger(ILoggerFactory factory, IMultiTenantProvider multiTenantProvider)
{
if (factory == null)
{
throw new ArgumentNullException(nameof(factory));
}
if (multiTenantProvider == null)
{
throw new ArgumentNullException(nameof(multiTenantProvider));
}
var category = multiTenantProvider.GetTenantName<T>();
_logger = factory.CreateLogger(category);
}
IDisposable ILogger.BeginScope<TState>(TState state) => _logger.BeginScope(state);
bool ILogger.IsEnabled(LogLevel logLevel) => _logger.IsEnabled(logLevel);
void ILogger.Log<TState>(LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> formatter)
=> _logger.Log(logLevel, eventId, state, exception, formatter);
}
이
내 시작입니다!