.net Azure应用程序服务的Azure日志流中显示的重复日志项

.net Azure应用程序服务的Azure日志流中显示的重复日志项,.net,azure-web-app-service,.net,Azure Web App Service,我有一个.Net Core 2.2 web应用程序,它使用开箱即用的ILogger记录有关该应用程序的信息。在本地调试时,信息会按预期记录在调试控制台中。但是,当应用程序作为应用程序服务部署到Azure时,在Azure日志流中查看时,日志条目会重复 在Azure门户上,安装了Asp.Net核心日志记录扩展(V2.2.0) 这是在我的web应用程序中完成日志记录的代码(c#) public class MyService : BackgroundService { private read

我有一个.Net Core 2.2 web应用程序,它使用开箱即用的ILogger记录有关该应用程序的信息。在本地调试时,信息会按预期记录在调试控制台中。但是,当应用程序作为应用程序服务部署到Azure时,在Azure日志流中查看时,日志条目会重复

在Azure门户上,安装了Asp.Net核心日志记录扩展(V2.2.0)

这是在我的web应用程序中完成日志记录的代码(c#)

public class MyService : BackgroundService
{
    private readonly ILogger<MyService> _logger;

    public MyService(ILogger<MyService> logger)
    {
        _logger = logger;
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.Log(LogLevel.Information, "The service task is starting.");
        var count = 0;
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.Log(LogLevel.Information, $"The service task is doing background work. count is: {count}. Hashcode is: {_logger.GetHashCode()} on thread: {Thread.CurrentThread.ManagedThreadId}");

            // some background work

            count++;

            Task.Delay(60000, stoppingToken).GetAwaiter().GetResult();
        }

        _logger.Log(LogLevel.Information, "The service task is terminating.");

        return (Task.FromResult<object>(null));
    }
}
将MyService添加到服务集合

public class Startup
{
    private readonly ILoggerFactory _loggerFactory;
    private readonly ILogger _logger;
    private readonly ILogger _startupLogger;

    public Startup(IConfiguration configuration, ILoggerFactory loggerFactory)
    {
        Configuration = configuration;
        _loggerFactory = loggerFactory;
        _logger = _loggerFactory.CreateLogger("GlobalException");
        _startupLogger = _loggerFactory.CreateLogger(typeof(Startup));
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
       _startupLogger.LogInformation($"Adding common services");

       services.AddCommonServices(Configuration, _logger);
    }
}

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddCommonServices(this IServiceCollection services, IConfiguration configuration, ILogger logger)
    {
        services.AddMvc(options =>
        {
            options.Filters.Add(new ExceptionFilter(logger));
        })

        services.AddSingleton<IHostedService, MyService>();

        return services;
    }
}
在Azure日志流中,我期望每个任务周期有一行输出,如下所示: 2019-06-27 08:36:25.488+00:00[信息]我的服务:延迟的后台服务任务正在做后台工作。计数是:3。线程1上的哈希代码为61705107

但我得到了三个这样的副本:

2019-06-27 08:36:25.488+00:00[信息]我的服务:服务任务正在做后台工作。计数是:3。线程1上的哈希代码为61705107

2019-06-27 08:36:25.482+00:00[信息]我的服务:服务任务正在做后台工作。计数是:3。线程1上的哈希代码为61705107


2019-06-27 08:36:25.224+00:00[信息]我的服务:服务任务正在做后台工作。计数是:3。线程1上的Hashcode为:61705107

MyService中的日志消息与Azure日志流中的消息不匹配。我猜日志消息来自
BackgroundService
?如果是的话,你能提供代码吗?嗨,Ryan,消息来自后台服务。上面代码中真正的消息是:2019-06-27 08:36:25.488+00:00[信息]MyService:服务任务正在做后台工作。计数是:计数是:3。线程上的哈希代码是:61705107:1 2019-06-27 08:36:25.482+00:00[信息]MyService:服务任务正在进行后台工作。计数是:计数是:3。线程上的哈希代码是:61705107:1 2019-06-27 08:36:25.224+00:00[信息]MyService:服务任务正在进行后台工作。计数是:计数是:3。Hashcode is:61705107在线程:1是否可以包含正在进行日志记录的
BackgroundService
中的代码段?在上面的问题描述中添加了BackgroundService中的代码段。BackgroundService是nuget包中的功能。如何将
MyService
添加到服务集合中?
namespace Microsoft.Extensions.Hosting
{
    public abstract class BackgroundService : IHostedService, IDisposable
    {
        protected BackgroundService();
        public virtual void Dispose();
        // more methods
    }
}
public class Startup
{
    private readonly ILoggerFactory _loggerFactory;
    private readonly ILogger _logger;
    private readonly ILogger _startupLogger;

    public Startup(IConfiguration configuration, ILoggerFactory loggerFactory)
    {
        Configuration = configuration;
        _loggerFactory = loggerFactory;
        _logger = _loggerFactory.CreateLogger("GlobalException");
        _startupLogger = _loggerFactory.CreateLogger(typeof(Startup));
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
       _startupLogger.LogInformation($"Adding common services");

       services.AddCommonServices(Configuration, _logger);
    }
}

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddCommonServices(this IServiceCollection services, IConfiguration configuration, ILogger logger)
    {
        services.AddMvc(options =>
        {
            options.Filters.Add(new ExceptionFilter(logger));
        })

        services.AddSingleton<IHostedService, MyService>();

        return services;
    }
}
public class ExceptionFilter : ExceptionFilterAttribute
{
    private readonly ILogger _logger;
    public ExceptionFilter(ILogger logger)
    {
        _logger = logger;
    }
    public override void OnException(ExceptionContext context)
    {
        _logger.LogInformation("There was an error processing your request.");

        base.OnException(context);
    }
}