我已经构建了一个ASPNET Core应用程序并使用这些语句启用了日志:
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace));
loggerFactory.AddAzureWebAppDiagnostics();
现在的问题是,Azure日志中有很多其他日志详细信息来自Mircosoft软件包我不感兴趣。我似乎无法将我的日志配置传递给Azure,就像我为控制台所做的那样日志中。
我是否错过了如何使用诊断系统?
答案 0 :(得分:1)
在 Azure门户中启用应用程序诊断时,您也可以选择级别。此设置允许您将捕获的信息过滤为信息,警告或错误信息。
详细级别表示日志系统将记录应用程序生成的所有信息。
现在的问题是Azure日志中有很多来自我不感兴趣的Mircosoft软件包的其他日志详细信息。
您可以更改Azure门户上的级别以过滤要保存的日志。您可以随时更改Azure门户上的级别。与更改web.config文件不同,更改诊断日志级别不会回收应用程序在其中运行的应用程序域。
我想从不属于我的类别中排除日志,只是我在问题的第一行上使用配置执行。
Azure Web App日志记录扩展不支持按类别过滤日志。您可以创建一个新的记录器提供来实现此功能。
完成它有3个步骤。
第1步:添加需要实现ILogger接口的CustomLogger类。在这个类中,我们可以按级别和类别过滤日志,并将日志消息保存到我们想要的任何地方。
file_name.strip("01234567789")
第2步:添加需要实现ILoggerProvider接口的CustomLoggerProvider类。在本课程中,我们将创建一个CustomerLogger实例来记录信息。
public class CustomLogger : ILogger
{
private string _categoryName;
private Func<string, LogLevel, bool> _filter;
public CustomLogger(string categoryName, Func<string, LogLevel, bool> filter)
{
_categoryName = categoryName;
_filter = filter;
}
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 = $@"Level: {logLevel} {message}";
if (exception != null)
{
message += Environment.NewLine + Environment.NewLine + exception.ToString();
}
//save message to any place you wanted
}
}
第3步:添加CustomLoggerExtensions类,用于将LogLoggerProvider实例添加到记录器工厂。
public class CustomLoggerProvider : ILoggerProvider
{
private readonly Func<string, LogLevel, bool> _filter;
public CustomLoggerProvider(Func<string, LogLevel, bool> filter)
{
_filter = filter;
}
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger(categoryName, _filter);
}
public void Dispose()
{
}
}
在上面的步骤之后,我们可以使用以下代码来使用此自定义记录器。
public static class CustomLoggerExtensions
{
public static ILoggerFactory AddCustom(this ILoggerFactory factory,
Func<string, LogLevel, bool> filter = null)
{
factory.AddProvider(new CustomLoggerProvider(filter));
return factory;
}
}