如何控制Azure诊断日志的日志级别?

时间:2017-05-09 18:24:43

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

Azure门户中启用应用程序诊断时,您也可以选择级别。此设置允许您将捕获的信息过滤为信息,警告或错误信息。

enter image description here

详细级别表示日志系统将记录应用程序生成的所有信息。

  

现在的问题是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;
    }
}