Implementing Logging in a .NET Core Web Application using Serilog
Setting up default logging
Create a new MVC application from Visual Studio. By default, Logging is enabled in the application via the ILogger interface. It has got some built-in providers for writing the log information to the console, event log as well as for third-party providers such as NLog, Serilog, etc.
For example, if you want to write logging information to the console window or event log, you will need to configure it in the CreateDefaultHostBuilder
method in the Program.cs
file as shown below.
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.AddConsole(); logging.AddEventLog(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); });
In the case of a web app, you will get an ILogger
from the DI container and use that object for writing into the configured log providers. Let's see how we can do that in the HomeController
First, create a private variable for the logger interface.
private readonly ILogger<HomeController> _logger;
Then modify the constructor as shown below
public HomeController(ILoggerlogger) { _logger = logger; }
Now, use the LogInformation
method available in the logger interface to write a message into the log
public IActionResult Index() { _logger.LogInformation("Writing to log"); return View(); }
If we run the application and goto the home page now, you will see this message written to the console.
To write an error, we normally use LogError
method as shown below
public IActionResult Index() { _logger.LogInformation("Writing to log"); _logger.LogError("Error from Serlog sample"); return View(); }
And the output will be
Implementing Serilog to log in a flat-file
First, you will need to install the necessary packages given below.
Install-Package Serilog Install-Package Serilog.Extensions.Logging Install-Package Serilog.Sinks.File
Modify the appsettings.json
file to include the path for the log file
"Logging": { "LogPath": "logs//ex.log", "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } },
Then modify the Program.cs
file to read these values from the JSON file
var configSettings = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); .ConfigureAppConfiguration(config => { config.AddConfiguration(configSettings); })
Now, to hook up Serilog provider, import the namespace first and then modify CreateHostBuilder
method to set up the logger
using Serilog
Log.Logger = new LoggerConfiguration() .WriteTo.File(configSettings["Logging:LogPath"]) .CreateLogger(); .ConfigureLogging(logging => { logging.AddSerilog(); })
Here's the method is full
public static IHostBuilder CreateHostBuilder(string[] args) { var configSettings = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); Log.Logger = new LoggerConfiguration() .WriteTo.File(configSettings["Logging:LogPath"]) .CreateLogger(); return Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration(config => { config.AddConfiguration(configSettings); }) .ConfigureLogging(logging => { logging.AddSerilog(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); }
Now if we run the application, you will see the information being written to the file mentioned in the path.
No Comments
Connecting Azure Blob Storage account using Managed Identity
Posted 12/9/2022Securing Azure KeyVault connections using Managed Identity
Posted 11/26/2022Manage application settings with Azure KeyVault
Posted 11/9/2022Adding Serilog to Azure Functions created using .NET 5
Posted 4/3/2021Learn how to split log data into different tables using Serilog in ASP.NET Core
Posted 4/23/2020