Logging to a File using Serilog

M B A R KM B A R K
5 min read

One of the good features of Serilog is the ability to write log events to various outputs, including files. In this article, we will explore how to configure Serilog to write log events to a file and provide some examples of how to use it in a .NET application.

Installation

To get started, you will first need to install the Serilog package in your .NET project. This can be done via the NuGet package manager by running the following command in the package manager console:

Install-Package Serilog

You will also need to install the Serilog.Sinks.File package, which provides the capability to write log events to a file. This can be done by running the following command in the package manager console:

Install-Package Serilog.Sinks.File

Configuration

Once you have the necessary packages installed, you can configure Serilog to write log events to a file. This can be done by using the WriteTo.File() method when configuring the logger. For example, the following code configures Serilog to write log events to a file named log.txt in the application's current working directory:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt")
    .CreateLogger();

You can also specify the directory for the file, for example:

var log = new LoggerConfiguration()
    .WriteTo.File("C:\\mylogs\\log.txt")
    .CreateLogger();

It is also possible to specify the rolling interval for the log file, which determines how often the file will be rolled over and a new one created. For example, the following code configures Serilog to roll the log file over on a daily basis:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

Configure Serilog in an ASP.NET Core

To configure Serilog in an ASP.NET Core application, you will need to add the necessary packages and configure the logger in the Startup class. Here's an example of how to do this:

  1. In your ASP.NET Core project, install the Serilog and Serilog.Sinks.File packages using NuGet.

  2. In the Startup class, add the following code in the Configure method to configure the WriteTo.File() method and specify the file name and directory:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...
    Log.Logger = new LoggerConfiguration()
        .WriteTo.File("C:\\mylogs\\log.txt", rollingInterval: RollingInterval.Day)
        .CreateLogger();
    // ...
}

This will configure Serilog to write log events to a file named log.txt in the directory C:\mylogs and roll the file over on a daily basis.

Note: In the above example, It uses the RollingInterval.Day which means the log file will be rolled over every day, and new file will be created with the same name and a new date appended to it.

It's important to note that in the above example, it's assumed that the directory C:\mylogs already exists. If it doesn't exist, you should create it before running the application. Additionally, the directory path should be changed according to the desired location of the log file.

Usage

Once the logger is configured, you can use it to write log events in your application. Serilog provides a number of methods for logging events, such as Information, Warning, and Error. For example, the following code writes an informational log event to the file:

log.Information("Application started");

You can also include additional details with the log event, such as contextual data. For example, the following code writes a log event with additional details about the user:

log.Information("User {UserId} logged in", userId);

Advanced Configuration

Serilog allows for advanced configuration options such as controlling the format of the log events in the file, controlling the file's retention policy, and controlling the file's encoding.

Formatting Log Events

You can control the format of the log events in the file using the Formatter property. For example, the following code configures Serilog to write log events in JSON format:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt", formatter: new JsonFormatter())
    .CreateLogger();

Retention Policy

You can control the retention policy of the file by using the RetainedFileCountLimit property. For example, the following code configures Serilog to keep only the last 10 log files:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt", retainedFileCountLimit: 10)
    .CreateLogger();

Encoding

You can also control the file's encoding by using the Encoding property. For example, the following code configures Serilog to write log events to a file using UTF-8 encoding:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt", encoding: Encoding.UTF8)
    .CreateLogger();

Filtering

Filtering allows you to control which log events get written to the file by applying a set of rules. Serilog provides the Filter method to apply filters to the logger configuration.

For example, the following code will only write log events with a minimum level of Warning to the file:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt")
    .Filter.ByIncludingOnly(e => e.Level >= LogEventLevel.Warning)
    .CreateLogger();

You can also filter log events based on their properties, for example, the following code will only write log events that contain a specific property and its value:

var log = new LoggerConfiguration()
    .WriteTo.File("log.txt")
    .Filter.ByIncludingOnly(e => e.Properties.ContainsKey("UserId") 
    && e.Properties["UserId"].ToString() == "12345")
    .CreateLogger();

It is also possible to chain multiple filters together by using the And and Or methods.

Filtering can be a powerful tool for controlling the amount of information written to the log file and for focusing on only the events that are relevant for your use case.

Best Practices

Here are some best practices to keep in mind when using Serilog to write log events to a file:

  • Use structured logging: Serilog supports structured logging, which allows you to include additional details with the log event in the form of key-value pairs. This makes it easier to search and analyze the log events later on.

  • Rotate log files regularly: Rotating log files regularly (e.g. daily) can help keep the size of the log files under control and make it easier to find specific log events.

  • Use different log levels: Use different log levels (e.g. Information, Warning, Error) to classify log events and make it easier to understand the importance of each event.

  • Use context information: Use context information such as user ID, request ID, etc. to add additional context to log events and make it easier to understand the context in which an event occurred.

  • Use filters: Use filters to control which log events get written to the file. For example, you may only want to write log events with a certain log level or that contain certain context information.

  • Keep the log files secure: Make sure to keep the log files secure and restrict access to them to only authorized personnel.

By following these best practices, you can ensure that your log files are useful and informative, and that you can easily find the information you need when troubleshooting issues in your application.

0
Subscribe to my newsletter

Read articles from M B A R K directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

M B A R K
M B A R K

I’m a passionated .NET/C# developer, who likes to play around with C# and see how much I can do with it.