08.04.2022 akış
Program.cs içinde App'imize serilog ekliyoruz.
Aşağıdaki kütüphaneleri nuget üzerinden yüklüyoruz
Register edeceğimiz host servis kısmını loglamak için aşağıdaki yapıya serilog ekliyoruz
Middleware oluşturuyoruz.
Background taskımızı yazarken dotnet 6.0 yeni zamanlama apilerinden periodic timer kullanıyoruz.
Startup.cs içinde oluşturduğumuz middleware'i Configure metodu içine register ediyoruz
Aşağıdaki kütüphaneleri nuget üzerinden yüklüyoruz
Serilog.AspNetCore
Serilog.Exceptions
Serilog.Extensions.Logging
Serilog.Sinks.Console
Serilog.Sinks.RollingFile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public static int Main(string[] args) { //Loglamayı başlatıyoruz ILogger logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Error) .MinimumLevel.Override("Microsoft", LogEventLevel.Information) //.Enrich.FromLogContext() .Enrich.WithExceptionDetails() //.WriteTo.Console() .WriteTo.File(path:@"Logs/AppStatus.txt", rollingInterval: RollingInterval.Hour, formatter: new JsonFormatter(renderMessage: true)) .CreateLogger(); try { logger.Information("Starting CrmApp"); CreateHostBuilder(args).Build().Run(); return 0; } catch (Exception ex) { logger.Fatal(ex, "App terminated unexpectedly"); return 1; } finally { Log.CloseAndFlush(); } } |
Register edeceğimiz host servis kısmını loglamak için aşağıdaki yapıya serilog ekliyoruz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((app, config) => { config.AddJsonFile("appsettings.json"); config.AddJsonFile($"appsettings.{Env}.json"); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => options.AddServerHeader = false); webBuilder.UseStartup<Startup>(); }) .UseSerilog((hostContext, configuration) => { configuration.ReadFrom.Configuration(hostContext.Configuration) .MinimumLevel.Information() .Enrich.WithExceptionDetails() .WriteTo.File(path: @"Logs/AppListener.txt", rollingInterval: RollingInterval.Hour, formatter: new JsonFormatter(renderMessage: true)); }); |
Middleware oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public static class ApplicationBuilderExtensions { public static BackgroundLeadCheckTask Listener { get; set; } public static IApplicationBuilder UseEventListener(this IApplicationBuilder app) { var life = app.ApplicationServices.GetService<IHostApplicationLifetime>(); Listener = new BackgroundLeadCheckTask(app.ApplicationServices.GetService<ICustomerApiClient>(), app.ApplicationServices.GetService<ILogger>()); life.ApplicationStarted.Register(OnStarted); life.ApplicationStopping.Register(OnStopping); return app; } private static void OnStarted() { Listener.Start(TimeSpan.FromSeconds(10)); } private static void OnStopping() { Task.Run(async () => { await Listener.StopAsync(); }); } |
Background taskımızı yazarken dotnet 6.0 yeni zamanlama apilerinden periodic timer kullanıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | public class BackgroundLeadCheckTask { private Task _timerTask; private readonly CancellationTokenSource _cts = new(); private readonly ICustomerApiClient _customerApiClient; private readonly ILogger _logger; public BackgroundLeadCheckTask(ICustomerApiClient customerApiClient, ILogger logger) { _customerApiClient = customerApiClient; _logger = logger; } public void Start(TimeSpan timespan) { async Task DoStart() { try { var timer = new PeriodicTimer(timespan); while (await timer.WaitForNextTickAsync(_cts.Token)) { _logger.Information($"{DateTime.Now}"); } } catch (OperationCanceledException ex) { _logger.Error($"{ex.Message}"); _cts.Cancel(); } } _timerTask = DoStart(); FirstInit(); } public Task FirstInit() { _logger.Information($"ilk kod çağırıldı ve cache alınacak {DateTime.Now}"); return Task.CompletedTask; } public async Task StopAsync() { _cts.Cancel(); await _timerTask; _cts.Dispose(); _logger.Information($"BackgroundTask cancelled {DateTime.Now}"); } } |
Startup.cs içinde oluşturduğumuz middleware'i Configure metodu içine register ediyoruz
1 2 3 4 5 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseEventListener(); } |
Yorumlar
Yorum Gönder