Configure Serilog With SQL Server Sink Inside ASP.NET Core
ASP.NET Core configuration has been re-architected and doesn’t depend on Xml configurations any more, check this excellent article for an introduction about the new configuration system.
In order to use Serilog with SQL Server Sink follow the below steps:
Step1: Update the project.json
Update the project.json to reference the Serilog
and Serilog.Sinks.MSSqlServer
packages by adding the following lines at the end of the dependencies section.
"Serilog": "1.5.14",
"Serilog.Sinks.MSSqlServer": "3.0.48"
Step 2: Add Serilog SQL Server Sink settings into appsettings.json
Update appsettings.json
file to include all the required Serilog SQL Server Sink configuration by adding the following JSON at the end of the appsettings.json file and before the last closing curly braces, make sure to update the connection string to your relevant values.
"Serilog": {
"ConnectionString": "Server=(local);Database=serilogdemo;trusted_connection=true",
"TableName": "Logs"
}
Step 3: Update the Startup class to configure Serilog.ILogger
ASP.NET Core has a new builtin Dependency Injection feature that can be used by registering the services and their implementations through the ConfigureServices
method inside Startup
class so add the following section add the end of the ConfigureServices
method. The Dependency Injection feature provide three types of registrations Transient , Scoped and Singleton and for this question I have used Singleton just for demo purpose.
services.AddSingleton<Serilog.ILogger>(x=>
{
return new LoggerConfiguration().WriteTo.MSSqlServer(Configuration["Serilog:ConnectionString"], Configuration["Serilog:TableName"],autoCreateSqlTable:true).CreateLogger();
});
As you can see, the nested JSON configurations inside the appsettings.json could be read used the property Configuration
and the configuration values can be retrieved using :
as separator.
Note the above code is using autoCreateSqlTable
parameter to automatically create the log table if doesn’t exist; if you don’t like this approach you can use sql script to create the table at any step you like.
##Step 4: Get reference to the Serilog.ILogger You can get instance of the Serilog.ILogger via the Dependency Injection feature by simply adding variable in your constructor with object of the type Serilog.ILogger and then use the instance in any action method
private Serilog.ILogger _logger;
public HomeController(Serilog.ILogger logger)
{
this._logger = logger;
}