Itβs not overengineeringβitβs the foundation for observability, maintainability, and sane operations.
#logging #exceptionhandling #lessonslearned #architecture #consultancy #avivasolutions
@dennisdoomen.com.bsky.social
Microsoft MVP | Coding Architect | .NET Tech Lead | .NET & C# | TypeScript | Fluent Assertions Author | International Speaker | Occasional Trainer | React & VueJS | Event Sourcing Veteran | DDD Designer | TDD Practitioner | Clean Code Writer
Itβs not overengineeringβitβs the foundation for observability, maintainability, and sane operations.
#logging #exceptionhandling #lessonslearned #architecture #consultancy #avivasolutions
These decisions may seem small, but they are crucial for successful production use. And once things go sideways, cleaning it up is a costly, frustrating task. So make those decisions before the first try/catch hits the codebase. (contβd)
06.08.2025 16:29 β π 0 π 0 π¬ 1 π 0Or always wrap and rethrow? How should transient exceptions be handled, and should retries be logged differently? If you donβt decide this early, your logs will become inconsistent, your monitoring unreliable, and your debugging painful. (contβd)
06.08.2025 16:28 β π 0 π 0 π¬ 1 π 0And when to log at all. Just as importantly, you need to define what not to logβespecially when sensitive data is involved. The same goes for exceptions. What types should be thrown and when? Should you ever catch and swallow? (contβd)
06.08.2025 16:28 β π 0 π 0 π¬ 1 π 0Thatβs what happens when you donβt define your logging and exception strategy upfront. And no, itβs not βjust common sense.β Teams need to clearly document what each logging level means, what qualifies for a warning vs. an error. (contβd)
06.08.2025 16:28 β π 1 π 0 π¬ 1 π 0Sometimes the log makes it look like the world is on fireβonly to realize someone just used the wrong log level. Or worse, the real issue is buried beneath irrelevant noise because no one agreed on what should be logged in the first place. (contβd)
06.08.2025 16:28 β π 0 π 0 π¬ 1 π 0Weβve all been there β staring at a wall of log entries in Azure App Insights or your local console, trying to make sense of a flood of warnings, errors, and stack traces that leadβ¦ nowhere. You dig, you filter, you search, but instead of answers, you find noise. (contβd)
06.08.2025 16:28 β π 0 π 0 π¬ 1 π 0PackageGuard 1.5 includes a couple of new features as well as bug fixes.
- Support for .slnx format
- Allow denying prerelease packages
- Display the version in output log
- Fix license detection of NUnit and NETStandard.Library
Read more about PackageGuard at github.com/dennisdoomen...
The second half of 2025 promises to as exciting as the first half was. Can't wait to engage with the developer community all over Europe.
31.07.2025 12:53 β π 3 π 0 π¬ 0 π 0We do that too. Whenever there's a 409, 404, 400/422, we include the reason as a message. Otherwise the caller has to rely on the OpenAPI docs to understand what went wrong, which is costly and incomplete.
31.07.2025 06:41 β π 1 π 0 π¬ 0 π 0In the end, status codes arenβt just numbers. Theyβre part of your contract. Get them right, and your API becomes easier to use, debug, and evolve. Get them wrong, and even the best backend logic wonβt save the experience.
#httpapi #apidesign #restapis #lessonslearned #bestpractices #consultancy
And think long-term. Some decisionsβlike the color of your buttonsβare easy to reverse. But your HTTP strategy? Once itβs baked into clients, docs, and SDKs, changing it is expensive. Choose carefully up front, and save yourself future pain. (cont'd)
30.07.2025 13:03 β π 0 π 0 π¬ 1 π 0Some things arenβt fully standardized yet. Youβll find teams using 409 (Conflict) for business rule violations, while others treat those same situations as 400 Bad Request. That ambiguity is where friction starts. Document your choices and stick to them. (cont'd)
30.07.2025 13:03 β π 0 π 0 π¬ 1 π 0Thatβs why it pays to be intentional about which HTTP codes you use, and when. Consistency beats cleverness here. Whether itβs 200 vs. 204 for a successful POST, or 400 vs. 422 for invalid input, what matters most is that your teamβand your consumersβknow what to expect. (cont'd)
30.07.2025 13:03 β π 0 π 0 π¬ 1 π 0When building HTTP APIs, clarity is everything. Developers rely on status codes not just to confirm success, but to understand what went wrongβand what to do next. If your API canβt communicate that cleanly, youβre not just confusing clientsβyouβre slowing everyone down. (cont'd)
30.07.2025 13:02 β π 0 π 0 π¬ 2 π 0What's the most satisfying (>2000 piece) #lego set you've built recently? I'm looking for something after I finally finish the Ferrari Daytona.
25.07.2025 11:49 β π 1 π 0 π¬ 2 π 0I've you've been using the JetBrains Annotations NuGet package to give hints to Rider on how code is used inside and outside your codebase, there's a source-only version of that package that will help avoiding the dependency hell. See www.nuget.org/packages/Jet...
25.07.2025 11:41 β π 2 π 0 π¬ 0 π 0Copilot autonomously providing a GitHub pull request for a feature or issue in my open-source projects is truly amazing to see. github.com/dennisdoomen...
23.07.2025 06:25 β π 0 π 0 π¬ 0 π 0Last weekend, I've pushed a small improvement to Pathy, a small open-source project for fluently building and using file and directory paths without binary dependencies. Check out the read-me at github.com/dennisdoomen...
21.07.2025 13:31 β π 0 π 0 π¬ 0 π 0My "early access" Teams regularly stops the incoming video (as well as that of my camera) while sharing a window. It's an i7-14700K with an RTX 5080. I have to kill and restart Teams to fix this. Has anybody observed something similar.
21.07.2025 07:31 β π 0 π 0 π¬ 1 π 0If you're wondering what this is about, check out www.dennisdoomen.com/2025/06/libr...
18.07.2025 12:43 β π 0 π 0 π¬ 0 π 0* Renamed the initial class that is generated to MyClass to prevent conflicts with the namespace
* Ensured the Roslyn analyzers are really running
* There was a conflict in the template names, resulting in a warning when installing the templates
This week, I've shipped a new version of the .NET Library Starter Kit. Version 1.4 comes with several improvements:
* Employ PackageGuard 1.4's caching to speed-up license scanning
* The assemblies build by the template's solution were not versioned correctly.
* Minor tweaking of the .editorconfig
I wish π«£
16.07.2025 19:48 β π 0 π 0 π¬ 0 π 0Check out the full release notes at github.com/dennisdoomen...
16.07.2025 16:17 β π 0 π 0 π¬ 0 π 0Version 1.4 solves that by providing two new options.
--use-caching will keep a persistent cache containing the most recent license information that you can store in source-control.
--github-api-key allows you to provide a Personal Access Token that PackageGuard will use to access the GitHub API.
One of the challenges in building #PackageGuard is to extract the license information from either the GitHub repository or some other internet location. This process takes quite some time and slows down the analysis and sometimes even causes rate-limiting errors coming from GitHub.
16.07.2025 16:15 β π 1 π 1 π¬ 1 π 0A very nice perspective on AI tooling by GitHub that I fully support (and recognize). See github.blog/ai-and-ml/ge...
16.07.2025 07:11 β π 0 π 0 π¬ 0 π 0Illustration of .net bot in a racecar submarine. text reads: .NET 10 Preview 6
HEY! .NET DEVS!!
Join the .NET team as we show off the latest features in .NET 10 Preview 6!
Streaming LIVE, HERE in just a few minutes β‘οΈ https://msft.it/63327s61wS
#dotnet #aspnet
Last weekend, we've pushed #FluentAssertions 8.5 to NuGet. It comes with a feature that we've been trying to finish for at least two years; the ability to have "BeEquivalentTo" optionally assert that the types of the objects and properties match as well.
See fluentassertions.com/releases/#850