当您在 Azure 门户 中启用应用程序诊断时,您还可以选择级别。此设置允许您将捕获的信息过滤为信息性、警告或错误信息。
详细级别意味着日志系统将记录应用程序产生的所有信息。
现在的问题是 Azure 日志中有很多来自我不感兴趣的 Mircosoft 软件包的其他日志详细信息。
您可以更改 Azure 门户上的级别以过滤要保存的日志。您可以随时更改 Azure 门户上的级别。与更改 web.config 文件不同,更改诊断日志级别不会回收运行应用程序的应用程序域。
我想从不属于我的类别中排除日志,只需在问题的第一行中使用配置进行操作即可。
Azure Web App Logging 扩展不支持按类别筛选日志。您可以创建一个新的记录器提供来实现此功能。
完成它有 3 个步骤。
第一步:添加一个需要实现ILogger接口的CustomLogger类。在这个类中,我们可以按级别和类别过滤日志,并将日志消息保存到我们想要的任何地方。
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
}
}
第二步:添加一个CustomLoggerProvider类,该类需要实现ILoggerProvider接口。在这个类中,我们将创建一个 CustomerLogger 的实例来记录信息。
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()
{
}
}
第 3 步:添加 CustomLoggerExtensions 类,用于将 CustomLoggerProvider 实例添加到 logger factory。
public static class CustomLoggerExtensions
{
public static ILoggerFactory AddCustom(this ILoggerFactory factory,
Func<string, LogLevel, bool> filter = null)
{
factory.AddProvider(new CustomLoggerProvider(filter));
return factory;
}
}
在上面的步骤之后,我们可以使用下面的代码来使用这个自定义记录器。
loggerFactory.AddCustom((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace));