【问题标题】:How do I control the log level for Azure Diagnostic Logs?如何控制 Azure 诊断日志的日志级别?
【发布时间】:2017-05-11 17:43:47
【问题描述】:

我已经构建了一个 ASPNET Core 应用程序并使用以下语句启用了日志:

    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug((category, logLevel) => (category.Contains("WEBAPI") && logLevel >= LogLevel.Trace));
    loggerFactory.AddAzureWebAppDiagnostics();

现在的问题是 Azure 日志有很多来自我不感兴趣的 Mircosoft 软件包的其他日志详细信息。我似乎无法将我的日志记录配置传递给 Azure,尽管就像我为控制台日志所做的那样。

我是否错过了应该如何使用诊断系统?

【问题讨论】:

  • 门户中设置的日志详细信息是什么?您应该能够将那里的级别设置为例如警告。
  • @juunas 设置为Verbose,我想问的是如何按类别控制级别。这是我想不通的。

标签: azure asp.net-core azure-web-app-service


【解决方案1】:

当您在 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));

【讨论】:

  • 这是很棒的信息!但我真正的意思是我想根据类别进行过滤......我想从不属于我的类别中排除日志,只需在我的问题的第一行中使用配置进行。
  • 很抱歉误解了您的问题。我根据您的评论更新了我的回复。
  • 哇!现在这是一个答案!非常感谢。
猜你喜欢
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多