I am using Serilog in a ASP.Net Project with the following code in my Program.cs:
using Alters_Ehejubiläen_Weihnachtsbriefe_Ehrenpatenschaften.Data;
using Alters_Ehejubiläen_Weihnachtsbriefe_Ehrenpatenschaften.Models;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Context;
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Configuration;
namespace Alters_Ehejubiläen_Weihnachtsbriefe_Ehrenpatenschaften
{
public class Program
{
public static void Main(string[] args)
{
string connectionString ="";
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
try
{
//Beispielhafte Integration der Serilog-Protokollierung
var expr1 = "UserAction is not null";
var expr2 = "ActionException is not null";
string env_string = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT").ToLower();
if (env_string.Equals("development") || env_string.Equals("staging"))
{
connectionString = config.GetConnectionString("WebAppContextStaging");
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Information()
.AuditTo.Logger(lc => lc
.Filter.ByIncludingOnly(expr1)
.AuditTo.MSSqlServer(connectionString: connectionString, sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions { TableName = "UserActionLog", AutoCreateSqlTable = true, BatchPostingLimit = 1 }))
.AuditTo.Logger(lc => lc
.Filter.ByIncludingOnly(expr2)
.AuditTo.MSSqlServer(connectionString: connectionString, sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions { TableName = "ExceptionLog", AutoCreateSqlTable = true, BatchPostingLimit = 1 }))
.CreateLogger();
}
else if (env_string.Equals("production"))
{
connectionString = config.GetConnectionString("WebAppContextProduction");
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Information()
.AuditTo.Logger(lc => lc
.Filter.ByIncludingOnly(expr1)
.AuditTo.MSSqlServer(connectionString: connectionString, sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions { TableName = "UserActionLog", AutoCreateSqlTable = true, BatchPostingLimit = 1 }))
.AuditTo.Logger(lc => lc
.Filter.ByIncludingOnly(expr2)
.AuditTo.MSSqlServer(connectionString: connectionString, sinkOptions: new Serilog.Sinks.MSSqlServer.MSSqlServerSinkOptions { TableName = "ExceptionLog", AutoCreateSqlTable = true, BatchPostingLimit = 1 }))
.CreateLogger();
}
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
var ex = (Exception)args.ExceptionObject;
using (LogContext.PushProperty("ActionException", "StartupFailure")) { Log.Error("Es ist ein fataler Fehler in der Methode Program.Main aufgetreten: " + ex.Message + ", InnerException: " + ex.InnerException); }
};
}
catch (Exception ex)
{
using (LogContext.PushProperty("ActionException", "StartupFailure")) { Log.Error("Es ist ein fataler Fehler in der Methode Program.Main aufgetreten: " + ex.Message + ", InnerException: " + ex.InnerException); }
}
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
An unhandeld Exeption (not thrown in try block) gets logged if I throw it in the Programm.cs Code. It gets logged in:
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
var ex = (Exception)args.ExceptionObject;
using (LogContext.PushProperty("ActionException", "StartupFailure")) { Log.Error("Es ist ein fataler Fehler in der Methode Program.Main aufgetreten: " + ex.Message + ", InnerException: " + ex.InnerException); }
};
But if I throw an Exeption in another class like a Controller the Exception does not get logged with Serilog. How can I log all Exceptions of my application with Serilog without putting everything in try/catch blocks?