[英]How to provide to ASP.Net Core Logging extra parameters
I am following this example to customize the core logging to save my logs to DB.我正在按照此示例自定义核心日志记录以将我的日志保存到数据库。 I got most of it working, but there is only one issue: I need to pass the Log method, in the DBLogger class, more parameters in a clean way.
我得到了大部分工作,但只有一个问题:我需要在 DBLogger 类中传递 Log 方法,以干净的方式传递更多参数。 It currently has this signature:
它目前具有以下签名:
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
I would like to be able to include few other fields.我希望能够包括其他几个领域。 I guess I can add them to the "state" field delimited by pipe for later decomposition, but this way looks ugly.
我想我可以将它们添加到由管道分隔的“状态”字段中以供以后分解,但这种方式看起来很难看。
Here is the main part of the code:这是代码的主要部分:
// DBLoggerExtensions
public static class DBLoggerExtensions
{
public static ILoggerFactory AddContext(
this ILoggerFactory factory,
Func<string, LogLevel, bool> filter = null
)
{
factory.AddProvider(new DBLoggerProvider(filter));
return factory;
}
public static ILoggerFactory AddContext(this ILoggerFactory factory, LogLevel minLevel)
{
return AddContext(
factory,
(_, logLevel) => logLevel >= minLevel);
}
}
//LoggerProvider
public class DBLoggerProvider : ILoggerProvider
{
private readonly Func<string, LogLevel, bool> _filter;
public DBLoggerProvider(Func<string, LogLevel, bool> filter)
{
_filter = filter;
}
public ILogger CreateLogger(string categoryName)
{
return new DBLogger(categoryName, _filter);
}
public void Dispose()
{
}
}
//DBLogger:
public class DBLogger : ILogger
{
private string _categoryName;
private Func<string, LogLevel, bool> _filter;
private CustomLoggerDBContext _context;
private bool _selfException = false;
public DBLogger(string categoryName, Func<string, LogLevel, bool> filter)
{
_categoryName = categoryName;
_filter = filter;
_context = new CustomLoggerDBContext();
}
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel))
{
return;
}
if (_selfException)
{
_selfException = false;
return;
}
_selfException = true;
if (formatter == null)
{
throw new ArgumentNullException(nameof(formatter));
}
var message = formatter(state, exception);
if (string.IsNullOrEmpty(message))
{
return;
}
if (exception != null)
{
message += "\n"+ exception.ToString();
}
try
{
message = message.Length > CustomLoggerDBContext.MessageMaxLength ?
message.Substring(0,CustomLoggerDBContext.MessageMaxLength):message;
_context.EventLog.Add(new EventLog {
Message = message,
EventId = eventId.Id,
LogLevel = logLevel.ToString(),
CreatedTime = DateTime.UtcNow });
_context.SaveChanges();
_selfException = false;
}
catch { }
}
public bool IsEnabled(LogLevel logLevel)
{
return (_filter == null || _filter(_categoryName, logLevel));
}
public IDisposable BeginScope<TState>(TState state)
{
return null;
}
}
Appreciate it.欣赏它。
You don't get those parameters.你没有得到这些参数。 They are used in formatting.
它们用于格式化。 See the example where parameters are added in formatting
请参阅在格式中添加参数的示例
var usuario = "marcelo";
var endereco = "Rua A, número 123";
logger.LogInformation("Erro: Usuario: {usuario}, Enderço: {Endereco}", usuario, endereco);
//Func<TState, Exception, string> formatter => "Erro: Usuario: marcelo, Enderço: Rua A, número 123"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.