A fork published by MMPWorks to demonstrate migrating a real .NET application from Serilog to Herald. This repository is an unmodified copy of the upstream application except for the logging migration described below.
Original project yanpitangui/dotnet-api-boilerplate — an ASP.NET Core clean-architecture API template Original authors Yan Pitangui License MIT — © 2020 Yan Pitangui. Preserved unchanged in LICENSE; all copyright remains with the original author.What MMPWorks changed Only the logging migration below. The application itself is untouched.
Verdict: viable drop-in. net9. The 86 ILogger<T> call sites did not change — the migration is 4 files and one namespace swap, not your code.
// Directory.Packages.props — Central Package Management
- <PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
+ <PackageVersion Include="MMP.Herald.Serilog" Version="0.12.6" />
+ <PackageVersion Include="Herald.OSS.Serilog.Settings" Version="0.12.6" />
// appsettings.json keeps its Serilog: block; ReadFrom.Configuration reads it.
// Your ILogger<T> call sites do not change.This is the config-as-data case. The whole point of the project is that logging is declared in JSON, not code — so the migration has to carry the reader, not just the API. It does: the appsettings.json Serilog: block stays in place and ReadFrom.Configuration reads it after the package swap.
We proved this on a live run against a real Postgres (Testcontainers Postgres 16), not just a compile.
- The 86
ILogger<T>call sites did not change. UseSeriloghost wiring carried.- The
ReadFrom.Configurationappsettings reader carried. - The global level floor carried — we drove it to Warning and watched the line count go to zero.
- Per-source
MinimumLevel.Overridenow carries from appsettings — EF Core lines hold their own Warning floor (proven on the live run). - A runtime
LoggingLevelSwitchtakes effect immediately, on every dispatch path — change the level mid-run and the very next event obeys it. This is the thing only a real run shows. Serilog.Exceptionsstructured exception destructuring carries: custom exception properties survive to the sink as flat, queryable keys (exception.data.OrderId,exception.inner.data.RetryCount) through.Enrich.WithExceptionDetails(). This was the one real data loss the migration set surfaced, and it is closed — the structured fields now reach the sink instead of collapsing into the message string.- Tests: 22 passed, 0 failed, 0 skipped (integration suite against Testcontainers Postgres 16). The logging path is proven by the live run.
The per-source MinimumLevel.Override carries from appsettings for the global floor and for EF Core — EF Core Database.Command lines obey the JSON Warning floor, which is the part a green build never shows. One honest residual: a single Microsoft.AspNetCore.DataProtection line still prints at INF during host bootstrap. It is emitted before the category level map binds, so the per-category floor has not taken effect yet for that one line. The global floor and the EF Core override both clamp correctly. We state this rather than hide it.
Herald is Apache-2.0 open source: github.com/mmpworks/Herald.OSS.
The original project README follows, unchanged.
English | Português
A .Net 9.0 WebApi boilerplate / template project. MediatR, Swagger, AutoMapper Mapster, Serilog and more implemented.
The goal of this project is to be a kickstart to your .Net WebApi, implementing the most common used patterns and technologies for a restful API in .net, making your work easier.
- Use this template(github) or clone/download to your local workplace.
- Download the latest .Net SDK and Visual Studio/Code/Rider.
- You may need a running instance of Postgres, with appropriate migrations initialized.
- You can run just the DB on docker. For that, run the following command:
docker-compose up -d db-server. Doing that, the application will be able to reach the container of the db server.
- You can run just the DB on docker. For that, run the following command:
- Go to the src/Boilerplate.Api folder and run
dotnet run, or, in visual studio set the api project as startup and run as console/docker/IIS. - Visit http://localhost:7122/api-docs or https://localhost:7123/api-docs to access the application's swagger.
- Run
docker-compose up -din the root directory, or, in visual studio, set the docker-compose project as startup and run. This should start the application and DB.
-
- For docker-compose, you should run this command on the root folder:
dotnet dev-certs https -ep https/aspnetapp.pfx -p yourpasswordReplace "yourpassword" with something else in this command and the docker-compose.override.yml file. This creates the https certificate.
- For docker-compose, you should run this command on the root folder:
- Visit http://localhost:7122/api-docs or https://localhost:7123/api-docs to access the application's swagger.
Important: You need to have docker up and running. The integration tests will launch a Postgres container and use it to test the API.
In the root folder, run dotnet test. This command will try to find all test projects associated with the sln file.
If you are using Visual Studio, you can also access the Test Menu and open the Test Explorer, where you can see all tests and run all of them or one specifically.
In this project, some routes requires authentication/authorization. For that, you will have to use the api/identity/register route to create an account.
After that, you can login using the /api/identity/login without using cookies and then use received accessToken on the lock (if using swagger) or via the Authorization header on a http request.
For more information, please take a look on swagger documentation.
- SwaggerUI
- EntityFramework
- Postgres
- Minimal apis
- Strongly Typed Ids
- Test coverage collection
AutoMapperMapster- MediatR
- Feature slicing
- Serilog with request logging and easily configurable sinks
- .Net Dependency Injection
- Resource filtering
- Response compression
- Response pagination
- CI (Github Actions)
- Authentication
- Authorization
- Unit tests
- Integration tests with testcontainers
- Container support with docker and docker-compose
- OpenTelemetry support (with OLTP as default exporter)
- NuGet Central package management (CPM)
- Services
- This folder stores your apis and any project that sends data to your users.
- Boilerplate.Api
- This is the main api project. Here are all the controllers and initialization for the api that will be used.
- docker-compose
- This project exists to allow you to run docker-compose with Visual Studio. It contains a reference to the docker-compose file and will build all the projects dependencies and run it.
- Application
- This folder stores all data transformations between your api and your domain layer. It also contains your business logic.
- Auth
- This folder contains the login Session implementation.
- Domain
- This folder contains your business models, enums and common interfaces.
- Boilerplate.Domain
- Contains business models and enums.
- Auth
- This folder contains the login Session Interface.
- Infra
- This folder contains all data access configuration, database contexts, anything that reaches for outside data.
- Boilerplate.Infrastructure
- This project contains the dbcontext, entities configuration and migrations.
- Remove/Rename all hero related stuff to your needs.
- Rename solution, projects, namespaces, and ruleset to your use.
- Change the dockerfile and docker-compose.yml to your new csproj/folder names.
- Give this repo a star!
To run migrations on this project, you need the dotnet-ef tool.
- Run
dotnet tool install --global dotnet-ef - Now, depending on your OS, you have different commands:
- For windows:
dotnet ef migrations add InitialCreate --startup-project .\src\Boilerplate.Api\ --project .\src\Boilerplate.Infrastructure\ - For linux/mac:
dotnet ef migrations add InitialCreate --startup-project ./src/Boilerplate.Api/ --project ./src/Boilerplate.Infrastructure/
- For windows:
If this template was useful for you, or if you learned something, please give it a Star! ⭐
This project has great influence of https://github.com/lkurzyniec/netcore-boilerplate and https://github.com/EduardoPires/EquinoxProject. If you have time, please visit these repos, and give them a star, too!
This boilerplate/template was developed by Yan Pitangui under MIT license.