'dan erişme ASP.NET Core 1.0'da, ILoggerProvider
ve ILogger
arabirimlerinin özel bir uygulamasına sahibim. HttpContext'e Log
yönteminden erişebilmek istiyorum.Geçerli HttpContext'e bir ILogger
Özel bir ILogger
ürününe IHttpContextAccessor
enjekte etmem gerekiyor, ancak nasıl yapılacağını bulamıyorum. ILoggerProvider
nesnesi, başlangıçta oluşturulur ve CreateLogger
yöntemi, bağımlılık enjeksiyonuna izin vermez.
ILogger
ile bağımlılık enjeksiyonunu kullanmanın basit bir yolu var mı? yolu çalışır yukarıda i tercih ediyorum rağmen
public class CustomLogProvider : ILoggerProvider
{
private readonly Func<string, LogLevel, bool> _filter;
private readonly IHttpContextAccessor _accessor;
public CustomLogProvider(Func<string, LogLevel, bool> filter, IHttpContextAccessor accessor)
{
_filter = filter;
_accessor = accessor;
}
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger(categoryName, _filter, _accessor);
}
public void Dispose()
{
}
}
public class CustomLogger : ILogger
{
private string _categoryName;
private Func<string, LogLevel, bool> _filter;
private readonly IHttpContextAccessor _accessor;
public CustomLogger(string categoryName, Func<string, LogLevel, bool> filter, IHttpContextAccessor accessor)
{
_categoryName = categoryName;
_filter = filter;
_accessor = accessor;
}
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return (_filter == null || _filter(_categoryName, logLevel));
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel))
{
return;
}
if (formatter == null)
{
throw new ArgumentNullException(nameof(formatter));
}
var message = formatter(state, exception);
if (string.IsNullOrEmpty(message))
{
return;
}
message = $"{ logLevel }: {message}";
if (exception != null)
{
message += Environment.NewLine + Environment.NewLine + exception.ToString();
}
if(_accessor.HttpContext != null) // you should check HttpContext
{
message += Environment.NewLine + Environment.NewLine + _accessor.HttpContext.Request.Path;
}
// your implementation
}
}
public static class CustomLoggerExtensions
{
public static ILoggerFactory AddCustomLogger(this ILoggerFactory factory, IHttpContextAccessor accessor,
Func<string, LogLevel, bool> filter = null)
{
factory.AddProvider(new CustomLogProvider(filter, accessor));
return factory;
}
}
yerine HttpContextAccessor
enjekte özel IRequestLogger
uygulamak için:
Üzgünüm, benim cevap yayınlanmıştır ve sonra beni alt gördü. Bu zaten daha eksiksiz, bu yüzden oy verdim. –