.NET Aspire Seq integration
Includes: Hosting integration and Client integration
Seq is a self-hosted search and analysis server that handles structured application logs and trace files. It includes a JSON event store and a simple query language that make it easy to use. You can use the .NET Aspire Seq integration to send OpenTelemetry Protocol (OTLP) data to Seq. The integration supports persistent logs and traces across application restarts.
During development, .NET Aspire runs and connects to the datalust/seq
container image.
Hosting integration
The Seq hosting integration models the server as the SeqResource type. To access this type and the API, add the 📦 Aspire.Hosting.Seq NuGet package in the app host project.
dotnet add package Aspire.Hosting.Seq
For more information, see dotnet add package or Manage package dependencies in .NET applications.
Add a Seq resource
In your app host project, call AddSeq to add and return a Seq resource builder.
var builder = DistributedApplication.CreateBuilder(args);
var seq = builder.AddSeq("seq")
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent)
.WithEnvironment("ACCEPT_EULA", "Y");
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(seq)
.WaitFor(seq);
// After adding all resources, run the app...
Note
The Seq container may be slow to start, so it's best to use a persistent lifetime to avoid unnecessary restarts. For more information, see Container resource lifetime.
Accept the Seq End User License Agreement (EULA)
You must accept the Seq EULA for Seq to start. To accept the agreement in code, pass the environment variable ACCEPT_EULA
to the Seq container, and set its value to Y
. The above code passes this variable in the chained call to WithEnvironment.
Seq in the .NET Aspire manifest
Seq shouldn't be part of the .NET Aspire deployment manifest, hence the chained call to ExcludeFromManifest. It's recommended you set up a secure production Seq server outside of .NET Aspire for your production environment.
Persistent logs and traces
Register Seq with a data directory in your app host project to retain Seq's data and configuration across application restarts:
var seq = builder.AddSeq("seq", seqDataDirectory: "./seqdata")
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent);
The directory specified must already exist.
Add a Seq resource with a data volume
To add a data volume to the Seq resource, call the WithDataVolume method on the Seq resource:
var builder = DistributedApplication.CreateBuilder(args);
var seq = builder.AddSeq("seq")
.WithDataVolume()
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent);
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(seq)
.WaitFor(seq);
The data volume is used to persist the Seq data outside the lifecycle of its container. The data volume is mounted at the /data
path in the Seq container and when a name
parameter isn't provided, the name is generated at random. For more information on data volumes and details on why they're preferred over bind mounts, see Docker docs: Volumes.
Add Seq resource with data bind mount
To add a data bind mount to the Seq resource, call the WithDataBindMount method:
var builder = DistributedApplication.CreateBuilder(args);
var seq = builder.AddSeq("seq")
.WithDataBindMount(source: @"C:\Data")
.ExcludeFromManifest()
.WithLifetime(ContainerLifetime.Persistent);
var myService = builder.AddProject<Projects.ExampleProject>()
.WithReference(seq)
.WaitFor(seq);
Important
Data bind mounts have limited functionality compared to volumes, which offer better performance, portability, and security, making them more suitable for production environments. However, bind mounts allow direct access and modification of files on the host system, ideal for development and testing where real-time changes are needed.
Data bind mounts rely on the host machine's filesystem to persist the Seq data across container restarts. The data bind mount is mounted at the C:\Data
on Windows (or /Data
on Unix) path on the host machine in the Seq container. For more information on data bind mounts, see Docker docs: Bind mounts.
Client integration
To get started with the .NET Aspire Seq client integration, install the 📦 Aspire.Seq NuGet package in the client-consuming project, that is, the project for the application that uses the Seq client.
dotnet add package Aspire.Seq
Add a Seq client
In the Program.cs file of your client-consuming project, call the AddSeqEndpoint extension method to register OpenTelemetry Protocol exporters to send logs and traces to Seq and the .NET Aspire Dashboard. The method takes a connection name parameter.
builder.AddSeqEndpoint(connectionName: "seq");
Tip
The connectionName
parameter must match the name used when adding the Seq resource in the app host project. In other words, when you call AddSeq
and provide a name of seq
that same name should be used when calling AddSeqEndpoint
. For more information, see Add a Seq resource.
Configuration
The .NET Aspire Seq integration provides multiple options to configure the connection to Seq based on the requirements and conventions of your project.
Use configuration providers
The .NET Aspire Seq integration supports Microsoft.Extensions.Configuration. It loads the SeqSettings from configuration by using the Aspire:Seq
key. The following snippet is an example of an appsettings.json file that configures some of the options:
{
"Aspire": {
"Seq": {
"DisableHealthChecks": true,
"ServerUrl": "http://localhost:5341"
}
}
}
For the complete Seq client integration JSON schema, see Aspire.Seq/ConfigurationSchema.json.
Use inline delegates
Also you can pass the Action<SeqSettings> configureSettings
delegate to set up some or all the options inline, for example to disable health checks from code:
builder.AddSeqEndpoint("seq", static settings =>
{
settings.DisableHealthChecks = true;
settings.ServerUrl = "http://localhost:5341"
});
Health checks
By default, .NET Aspire integrations enable health checks for all services. For more information, see .NET Aspire integrations overview.
The .NET Aspire Seq integration handles the following:
- Adds the health check when SeqSettings.DisableHealthChecks is
false
, which attempts to connect to the Seq server's/health
endpoint. - Integrates with the
/health
HTTP endpoint, which specifies all registered health checks must pass for app to be considered ready to accept traffic.
Observability and telemetry
.NET Aspire integrations automatically set up Logging, Tracing, and Metrics configurations, which are sometimes known as the pillars of observability. For more information about integration observability and telemetry, see .NET Aspire integrations overview. Depending on the backing service, some integrations may only support some of these features. For example, some integrations support logging and tracing, but not metrics. Telemetry features can also be disabled using the techniques presented in the Configuration section.
Logging
The .NET Aspire Seq integration uses the following log categories:
Seq
Tracing and Metrics
The .NET Aspire Seq integration doesn't emit tracing activities and or metrics because it's a telemetry sink, not a telemetry source.
See also
.NET Aspire