.net Azure应用程序服务的Azure日志流中显示的重复日志项
我有一个.Net Core 2.2 web应用程序,它使用开箱即用的ILogger记录有关该应用程序的信息。在本地调试时,信息会按预期记录在调试控制台中。但是,当应用程序作为应用程序服务部署到Azure时,在Azure日志流中查看时,日志条目会重复 在Azure门户上,安装了Asp.Net核心日志记录扩展(V2.2.0) 这是在我的web应用程序中完成日志记录的代码(c#).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
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为:61705107MyService中的日志消息与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);
}
}